1

Javaを使用してファイルI/Oを学習しています。

以下は、2つの異なるJavaファイルからの私のコードです。1つはメインクラスの「File」で、もう1つは「FileWrite」です。

文字列の入出力を実装することができました。しかし、出力テキストファイルは最初はぎこちなく、理由はわかりません。

[File.Java]

package file;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class File {
    public static void main(String[] args) {

    try (BufferedReader br = new BufferedReader(new FileReader("B:\\fileIn.txt")))
            {
              String stCurrent;

              while ((stCurrent = br.readLine()) != null) {
                    System.out.println(stCurrent);
            }

            } catch (IOException e) {
                e.printStackTrace();
            } 
                    FileWrite fW = new FileWrite();
                    fW.serializeAddress("Boston", "Canada");
        }
}

[FileWrite.Java]

package file;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class FileWrite {

   public void serializeAddress(String city, String country) {
       try {
        FileOutputStream fout = new FileOutputStream("B:\\address.txt");
        ObjectOutputStream obOut = new ObjectOutputStream(fout);   
                obOut.writeUTF(city);
                obOut.writeUTF(country);
        obOut.close();
        System.out.println("Output Done");
       } catch(Exception ex) {
           ex.printStackTrace();
       }
   }
}

さて、「obOut.writeUTF(city); obOut.writeUTF(country);」について 2つの文字列入力を分離しました。それらを1つに組み合わせる方法はありますか?2つではなくobOut.writeUTF(city、counry)のように。それとも、これはこれらをオブジェクトにすることによってのみ達成可能ですか?

[更新]さらにいくつかインポートして試してみました

PrintStream ps = new PrintStream(new FileWriter("B:\\addressPS.txt")); 
ps.println(city); 
ps.println(country); 
ps.close(); 
But with errors, any clue?
4

4 に答える 4

1

あなたはすでにそれらを分離しておく正しいことをしています。都市と国は異なる分野です。

非常によくある間違いは、バイナリファイルとテキストファイル/ソケットストリームを区別しないことです。あなたは混乱につながる2つを混ぜています。自分が何をしているかについて非常に明確な考えがない限り、テキストWriter/ReaderまたはバイナリInput/OuptutStreamのみを訴えることをお勧めします。

要するに、あなたがテキストを書くものなら、

PrintStream ps = new PrintStream(new FileWriter(textFileName));
ps.println(city);
ps.println(country);
ps.close();
于 2013-01-13T14:37:59.650 に答える
0

writeUTFも文字列を受け取ります。市や郡の新しいオブジェクトを作成する必要はありません。

あなたはできませんobOut.writeUTF(city +" "+country);か?

于 2013-01-13T14:36:18.997 に答える
0

ぎこちないのは.writUTF()、javadocsに記載されている変更されたUTF形式でデータを書き込むためです。

AnObjectOutputStreamは通常、OBJECTSを出力するために使用されますが、文字列にも使用できると思います。ファイル内のデータを読み戻すために、クラス内のそれぞれの.readUTF()メソッドを使用できます。ObjectInputStream


また、JavaSE7の新機能であるtry-with-resourcesブロックを使用しようとしました。あなたはそうするべきではありません。代わりにこれを行う必要があります。

try (FileReader fr = new FileReader("B:\\fileIn.txt"); BufferedReader br = new BufferedReader(fr);) {

} catch (FileNotFoundException e1) {
  e1.printStackTrace();
} catch (IOException e1) {
  e1.printStackTrace();
}

FileReaderとBufferedReaderを分割すると、JavaSE7は両方のストリームを簡単に閉じることができます。これまでの方法では、tryブロックが終了すると、BufferedReaderストリームのみが閉じられます。

于 2013-01-13T14:57:43.907 に答える
0

定義上、ObjectOutputStream「ぎこちない」を生成します。これは人間が消費することを目的としたものではなく、オブジェクトを書き戻して読み戻すために使用される形式です。テキストエディタで結果を理解できるはずはありません。人間が読めるコンテンツを作成するには、OutputStreamWriterまたはを使用しPrintWriterます。つまり、最後の例は正しいので、エラーが発生した場合は、質問を編集してエラーを教えてください。

于 2013-01-13T15:43:14.230 に答える