2017-01-25 14 views
1

csvファイルを作成し、そのファイルにデータを書き込み、その内容をサーバーに送信するJavaプログラムを作成しました。ファイルシステムに保存せずにCSVファイルを作成する

ローカルでは、すべて正常に動作します。しかし、問題は私がサーバーへの書き込みアクセス権を持っていないということです(許可が拒否されました)。

したがって、私はchmod 777を実行できません。

csvファイルをファイルシステムに保存せずに作成する方法を探しています。フローやストリームに書き込むようなもの。私はそれがどのように機能するのか本当に分かりません。 助けてください?

public void exportAllToCSV(@PathVariable int id,HttpServletResponse response) throws IOException 
String csvFile="test.csv"; 
File file = new File("test.csv"); 
//some treatments to get datas (headers and values) 


    FileWriter writer = new FileWriter(csvFile); 
    CsvBuilder.writeLine(writer, headers); 
    CsvBuilder.writeLine(writer, values); 
    writer.flush(); 
    writer.close(); 
    response.setContentType("text/csv"); 
    response.setHeader("Content-Disposition", "attachment; filename=" + csvFile); 
    final BufferedReader br = new BufferedReader(new FileReader(file)); 

    try { 
     String line; 

     while ((line = br.readLine()) != null) { 
      response.getWriter().write(line + "\n"); 
     } 
    } finally { 
     br.close(); 
    } 

    try { 
     file.delete(); // I delete the file 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+1

を持っているStringBuilderWriterを使用することができますか? CSVファイルを 'response.getWriter()'に直接書くのはなぜですか? –

+1

ファイルを保存せずに書き込むことはできません。 「保存」とは、ファイルを書き込んで閉じてしまうことを意味します。 – rajah9

+0

なぜあなたはBufferedReaderでファイルを読んで、everylineをArrayListに入れて、それを処理しないのですか?あなたはファイルを書きません。あなたはあなたのオペレーティングメモリで作業しています。保存せずに「書き込む」ことはできません。「書き込み」は、その名前のとおり、ディスクに書き込むメソッドです。 – Amnor

答えて

2

なぜjava.io.StringWriterjava.util.Scannerを使用していない、CsvBuilder.writeLine(...)だけjava.io.Writerのインスタンス受け入れないと仮定すると?

// ... 

StringWriter writer = new StringWriter(); 
CsvBuilder.writeLine(writer, headers); 
CsvBuilder.writeLine(writer, values); 
writer.flush(); 

response.setContentType("text/csv"); 
response.setHeader("Content-Disposition", "attachment; filename=test.csv"); 

Scanner scanner = new Scanner(new StringReader(writer.toString())) 
while (scanner.hasNext()) { 
    response.getWriter().write(scanner.next() + "\n"); 
} 

// ... 

はしかし、私はresponse.getWriter()を使用してアンドレイMakarevichの答えは直接、おそらく最も前方のアプローチだと思います。あなたが明示的にそれらを追加して以来、改行がCsvBuilderによって追加されるかどうかはわかりませんが、

+0

ほとんど良い!私はcsvを持っていますが、問題が1つあります:文の中にスペースがあると、スペースの後の単語が次の行に入ります.. scanner.hasNext()の部分を説明してください。 – John

+0

'scanner.hasNext()'は、別の行が存在し、 'scanner.next()'がその行を取得しているかどうかをチェックします。文の中にスペースがあるときに改行が得られる理由は分かりません。 –

+0

それは動作します!私は直接試してみました:response.getWriter()。write(writer.toString()+ "\ n");ありがとうございます – John

2

を一時ファイルが許可されている場合は、試すことができます:

これは私がこれまで行ってきたものだった

File temp = File.createTempFile("test.csv", ".csv"); 

をこれらのファイルは、システムのユーザーストレージに作成されたばかりされています、 WindowsのC:\ Users [Username] \ AppDataと似ています。私は正確な道を知らないが、今は重要ではない。

は、より多くのFileOutputStreamがあり、Javaで存在するOutputStreamsのすべての種類を、チェックアウト: https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html サブクラスを確認してください。

3

あなたは応答に直接書き込むしようとすることができます:

Writer writer = response.getWriter(); 

CsvBuilder.writeLine(writer, headers); 
CsvBuilder.writeLine(writer, values); 
writer.flush(); 
writer.close(); 

response.setContentType("text/csv"); 
response.setHeader("Content-Disposition","attachment; filename=" + csvFile); 

をそれはまたあなたのために許可されていない何らかの理由で、一時ファイル用に使用することができない場合は、メモリ内このかなり醜いを使用しようとすることができますバリアント。

List<Integer> output = new LinkedList<>(); 
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new OutputStream() { 
    @Override 
    public void write(int b) throws IOException { 
     output.add(b); 
    } 
})); 
// write all the things via CsvBuilder 
final BufferedReader reader = new BufferedReader(new InputStreamReader(new InputStream() { 
    @Override 
    public int read() throws IOException { 
     if (output.size() > 0) { 
      return output.remove(0); 
     } 
     return -1; 
    } 
})); 
+1

最初の部分のみ+1。2番目の部分は悪い考えであり、書き込まれたものから逆にデータを読み戻すので完全に壊れています。そのためには、StringWriterとStringReaderを使用してください。 –

+0

@ErwinBolwidt、注文を修正していただきありがとうございます。私は第二のものに悪いと醜いと言ったように –

+0

ほとんど。私はあなたが正しいと思う私は直接レスポンスを書くことを試みたが、私は私のブラウザのcsvファイルの内容だけがある。 .txtのように私はcsvファイルを取得しません。何か案が ? – John

0

あなたがファイルを作成する必要がないのはなぜ作家の代わりにしてFileWriter

final Writer writer = new StringBuilderWriter(); 
+0

Apache Commons 'StringBuilderWriter'?マルチスレッド環境では注意してください。 –

関連する問題