3

私は初心者で、コードをコピーして貼り付けるだけでなく、その概念を本当に学びたいと思っています。私は、Jave IO を正確に使用する方法を学びたかったのですが、私のさまざまなバージョンのコードを見て混乱し、がっかりしました。

だから私は自分のメモを作成し、ここで専門家に私が正しいかどうかを確認したいと思いました. これらは私自身の参照用です。完全ではないことは承知していますが、正しいかどうかを確認していただければ幸いです。

BufferedWriter と FileWriter を使用して、テキスト ファイルを (文字として) 書き込みます。欠点は、プリミティブ データ型を記述できないことです。

元:

BufferedWriter bw= new BufferedWriter (new FileWriter("a.txt", true)); 
String x;
while ((x=bw.readLine())!=null){
bw.newLine();
bw.write(x);
bw.flush();}

BufferedReader と FileReader を使用してテキスト ファイルを (文字として) 読み取る

元:

BufferedReader br = new BufferedReader (new FileReader("b.txt")); 
String x;
while ((x=br.readLine())!=null){
System.out.println(x);}

DataOutputStream と FileOutputStream を使用して、テキスト ファイル (バイナリ) に書き込みます。利点は、プリミティブ データ型と文字列を記述できることです。

元:

DataOutputStream dos = new DataOutputStream(new FileOutputStream("out.txt"));
dos.writeInt(cityIdA);    // int cityIdA = 9897;         
dos.writeUTF(cityNameA); //  String cityNameA = "Green Lake City";  
dos.writeInt(cityPopulationA); //   int cityPopulationA = 500000;  
dos.writeFloat(cityTempA); //  float cityTempA = 15.50f; 
dos.flush();

DataInputStream と FileInputStream を使用して、テキスト ファイル (バイナリ) を読み取ります。利点は、プリミティブ データ型と文字列を読み取ることができることです。

元:

DataInputStream dis = new DataInputStream(new FileInputStream("inp.txt"));
int cityId1 =dis.readInt();    // int cityIdA = 9897;         
String cityName1 =dis.readUTF(); //  String cityNameA = "Green Lake City";  
int cityPopulation1 =dis.readInt(); //   int cityPopulationA = 500000;  
float cityTemperature1 =dis.readFloat(); //  float cityTempA = 15.50f; 

実際のコード:

import java.io.*; 

class b{

public static void main (String args[]) throws IOException{
int cityIdA = 9897;         
String cityNameA = "Green Lake City"; 
int cityPopulationA = 500000;         
float cityTempA = 15.50f;      

BufferedWriter bw = new BufferedWriter(new FileWriter("shahar.txt"));

bw.write("9897");  
bw.write("Green Lake City"); 
bw.write("500000"); 
bw.write("15.50"); 
bw.flush();             
bw.close(); 

DataOutputStream dos = new DataOutputStream(new FileOutputStream("out.txt"));

dos.writeInt(cityIdA);      
dos.writeUTF(cityNameA);
dos.writeInt(cityPopulationA); 
dos.writeFloat(cityTempA);
dos.flush();

BufferedReader br = new BufferedReader (new FileReader("shahar.txt")); 
String x;
while ((x=br.readLine())!=null){
System.out.println(x);}


DataInputStream dos1 = new DataInputStream(new FileInputStream("out.txt"));
int cityId1 = dos1.readInt();    // int cityIdA = 9897;     
System.out.println( cityId1);
String cityName1 =dos1.readUTF(); //  String cityNameA = "Green Lake City";  
System.out.println(cityName1);
int cityPopulation1 =dos1.readInt(); //   int cityPopulationA = 500000;  
System.out.println(cityPopulation1);
float cityTemperature1 =dos1.readFloat(); //  float cityTempA = 15.50f; 
System.out.println(cityTemperature1);
 }
 }
4

2 に答える 2

3

コードには主観的にスタイル上の問題があります。自分で書いたかのように、ここに例を示します。

例2

(これを例1の前に置いたのには理由があります)

BufferedReader br = new BufferedReader (new FileReader("b.txt")); 
String x;

while ((x = br.readLine()) != null)
{ // changed style, but otherwise fine
    System.out.println(x);
}

例1

// borrowed reader from example 1
BufferedReader br = new BufferedReader (new FileReader("b.txt")); 
BufferedWriter bw = new BufferedWriter (new FileWriter("a.txt", true)); 
String x;

// this part didn't work.  You were trying to read from a writer, as you write to it.
// if this were an object capable of reading and writing at the same time, you would
// run into issues because they wouldn't be rewinding after each operation and you'd
// end up with a combination of unexpected mirrored lines and garbled crap.

// changed loop to read from reader.  reads data from one file, line by line, and
// writes to another.
while ((x = br.readLine()) != null) 
{
    bw.write(x);  // in the other order, file will start with a blank line
    bw.newLine(); // in this order, file will end with one instead
}
bw.flush(); // its better if this is not in the loop

例3および4

例3と4は問題ありません。バイナリファイルに多くのプリミティブ型を書き込む必要がある場合は、このようなものを使用します。他の例は、テキストを読むのにはるかに適しています。

あなたは初心者なので、ランダムなアドバイスもします。

  • 言語の欠点を非難するのではなく、それらを克服することを学びましょう。(すべての言語に適用)
  • スレッドはすべての問題の解決策ではありません。複数必要な場合は、自分でスケジューラーを作成してください。
  • 同じことを行う方法はたくさんありますが、多くの場合、1つが他よりも正しいです。
  • 後で自分を嫌うので、今はコードを書かないでください。
  • どのスタイルを使用するかは関係ありませんが、それに固執してください。そうは言っても、私はあなたが好きではありません。:)
  • どちらのスタイルを選択する場合でも、すべての条件下で簡単に読めることを確認してください。
  • お使いのコンピュータには無限のメモリがありません。そのようなふりをしてコードを記述しないでください。同じことが他のすべてのリソースにも当てはまります。だれも大食いが好きではありません。
于 2012-07-31T22:17:43.423 に答える
1

あなたの質問が有益な回答を得られるように構成されているかどうかはわかりません.

私は言うことができます:

「あなたの最初の例では:

BufferedWriter bw= new BufferedWriter (new FileWriter("a.txt", true)); 
String x;
while ((x=bw.readLine())!=null) {
    bw.newLine();
    bw.write(x);
    bw.flush();
}

bw.readLine()は正しくありません。BufferedWriter はライター クラスです。readLine() メソッドは含まれていません。ファイルから読み取るには、BufferedReader を使用する必要があります。

露骨に間違ったコードのインデントを除けば、残りの例は「正しい」ものです。」

しかし、それを言っても、全体像としては役に立ちません。あなたの質問の書き方から、あなたは Java を学び始めており、おそらくプログラミング全般に慣れていないと思われます。それで問題ありません。ただし、これは問題ないと思います。

...[I] was confused and disappointed to see so many different versions of code... So I made my own

それはよくありません。1 つの目標を達成するために非常に多くの異なる方法を目にするのは圧倒されるかもしれませんが、プログラミングには物事を行うための「正しい」方法はありません (ほとんどの場合.. 初心者とセマンティクスについて議論する必要はありません)。Java API は、何かを行うメソッドとツールを提供します。初心者のプログラミングの範囲では、メソッド自体の使用に関して何が「正しい」かを心配する必要はありません。単にメソッドに慣れ、これらのメソッドが何かを行い、それらを論理的に結び付けることができることを理解する必要があります。目標を達成するために。

「ファイルへの書き込み方法」を調べて、互いに異なる何百もの例を取得できます。別の人が「ファイルからの読み取り方法」をグーグルで検索し、このまさにStackOverflowの質問に出くわしてメモを読むとどうなりますか? 「ファイルから読み取るコードのさらに別のわずかに異なるバージョン」の山にメモを投げることができます。

通常、このようなことを行う方法についてメモをとっておくことは問題ないと思います-プログラミングコースを受講していて、逐語的にテストされる場合。あなたの場合、私はそれを思いとどまらせます。私はあなたがノートを編集し、プログラミングを開始し、「ファイルから何かを読み取る必要があるのですが、どうすればそれをやり直すことができるのですか? 次に、メモからコードをコピーして貼り付けます。それはあなたに何も教えません。「BufferedReader クラスを使用してファイルから読み取ることができることはわかっています。javadoc を見て、この特定のケースでファイルから読み取るためにそのメソッドを適用する論理的な方法を考えてみましょう。」

JavaDocs はあなたの友達です。「メモ」を使用せず、API の使用に慣れるための練習用プログラムを作成するだけで、はるかに速く学習できます。そのような「メモ」は、実際にあらゆる言語の熟練したプログラマーになるのに逆効果であると私は主張します。

私のやり方で答えるのに完全にベースから外れていたらごめんなさい。あなたのために探しているだけです。たぶん、メモを逐語的に覚えることがあなたの学習方法です。それもかっこいい。「正しい」と言うときI would appreciate if you could confirm whether [this code is] correct.、本当の意味はないことを覚えておいてください。コードは機能します。コードが機能する理由を知ること (または、自分でコードを実行して何が起こるかを確認し、機能しない場合は修正することを学ぶことなど) は、はるかに重要です。

幸運を!

于 2012-07-31T22:59:46.180 に答える