4

この文字「 ÿ」が出力ファイルの末尾に表示される理由を教えてください。(私はtry/catchを使っています)

        File f1 = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt");
        File f2 = new File("C:/Users/NetBeansProjects/QuestionOne/output.txt");
        fin = new FileInputStream(f1);
        fout = new FileOutputStream(f2);

        do {
            i = fin.read();
            fout.write(i);

        } while (i != -1);

コードはファイルの内容をコピーしますが、この奇妙な文字で終了します。コード全体を含める必要がありますか?

ありがとう。

4

4 に答える 4

13

fin.read()読み取るものが残っていない場合、メソッドは -1 を返します。しかし、あなたは実際にはその -1 を に書いてfoutいますfin。その ÿ 文字として表示されます。

この問題を回避するためにループを作成する 1 つの方法は、

    while((i = fin.read()) != -1 ){
        fout.write(i);
    } 
于 2012-11-03T07:58:17.493 に答える
5

Java 7 で導入された新しい Files クラスを使用してみてください

public static void copyFile( File from, File to ) throws IOException {
    Files.copy( from.toPath(), to.toPath() );
}
于 2012-11-03T08:08:31.217 に答える
5

最後fin.read()は何も読まないからです。JavaDocによると、が返されます。-1このため、あなたfout.write(i)はそれを書きます-1。この動作を修正するには、次のようにします。

do {
  i = fin.read();
  if (i>-1) //note the extra line
   fout.write(i);
} while (i != -1);

または、 を通話に変更しdo .. whileますwhile .. do

NIO一度に1 文字ずつ転送するよりもはるかに優れたパフォーマンスを発揮する新しい API も検討することをお勧めします。

File sourceFile = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt");  
File destFile = new File("C:/Users/NetBeansProjects/QuestionOne/output.txt");   

FileChannel source = null;                                                      
FileChannel destination = null;                                                 

try {                                                                           
    if (!destFile.exists()) {                                                   
        destFile.createNewFile();                                               
    }                                                                           
    source = new FileInputStream(sourceFile).getChannel();                      
    destination = new FileOutputStream(destFile).getChannel();                  
    destination.transferFrom(source, 0, source.size());                         
} catch (IOException e) {                                                       
    System.err.println("Error while trying to transfer content");               
    //e.printStackTrace();                                                      
} finally {                                                                     
    try{                                                                        
    if (source != null)                                                         
        source.close();                                                         
    if (destination != null)                                                    
        destination.close();                                                    
    }catch(IOException e){                                                      
        System.err.println("Not able to close the channels");                   
        //e.printStackTrace();                                                  
    }                                                                           
} 
于 2012-11-03T07:58:00.690 に答える
1

または、 fout の前に if(i != -1) を確認するだけです

do {
    i = fin.read();
    if(i != -1)
    fout.write(i);
   } while (i != -1);
于 2012-11-03T08:04:35.563 に答える