3

文字列の配列があります。それらの文字列をファイルに保存したいと思います。問題は、db.txtという名前の新しいファイルを作成する必要があることです(存在しない場合のみ)。次に、何らかの方法でそのファイルに文字列を書き込みます。

そして後で、そのファイルから文字列を読み取って配列に挿入できるようにしたいと思います。

配列の挿入と使用は問題ではありませんが、問題はファイルをどのように混乱させるかです。新しいテキストファイル(まだ存在しない場合)を作成するにはどうすればよいですか、ファイルに書き込むにはどうすればよいですか、それから読み取るにはどうすればよいですか?

自分で学ぼうとしたのですが、インターネットでいろいろと見て混乱してしまいました。

4

5 に答える 5

8

テキストファイルへの書き込みの例を次に示します。

File file = new File("./db.txt");
PrintWriter pw = new PrintWriter(file, true); // true for auto-flush
pw.println("Line 1");
pw.println("Line 2");
pw.println("Line 3");
pw.close();

既存のテキストファイルに追加する場合:

File file = new File("./db.txt");
FileWriter fw = new FileWriter(file, true); // true for appending
PrintWriter pw = new PrintWriter(fw, true); // true for auto-flush
pw.println("Line 4");
pw.println("Line 5");
pw.println("Line 6");
pw.close();

テキストファイルから読み取るには:

File file = new File("./db.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line1 = br.readLine();
String line2 = br.readLine();
String line3 = br.readLine();
br.close();

次の点も考慮してください。

于 2012-12-26T21:30:29.207 に答える
2

文字列の配列をファイルに保存する場合は、次のようにします。

public void saveToFile(Iterable<String> stringArray, String pathName) {
    File f = new File(pathName);
    try {
        FileWriter fileWriter = new FileWriter(f);

        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        for (String s : stringArray) {
            bufferedWriter.write(s);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }

        bufferedWriter.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

このスニペットは、ファイル内の各「行」を区切るために使用されるため、文字列配列に改行文字が含まれていないことを前提としています。

public Iterable<String> loadFile(String pathName) {
    File f = new File(pathName);

    ArrayList<String> output = new ArrayList<String>();
    try {
        Scanner scanner = new Scanner(f);

        String str = scanner.nextLine();

        while (str != null) {
            output.add(str);
            scanner.nextLine();
        }

    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }


    return output;
}

load fileメソッドが本当に文字列配列を返すようにしたい場合は、output.toArray()メソッドを呼び出してそれをに型キャストする必要があるかもしれませんString[]

于 2012-12-26T21:32:39.647 に答える
1

ファイルへの書き込みとファイルからの読み取り

ファイルからの読み取り

ファイルから読み取る場合は、パッケージBufferedReaderからクラスをインポートする必要があります。java.io.*

これで、BufferedReaderは引数としてaFileReaderを取り、次に、読み取り元のファイルの名前を引数として取ります。これをコードで示しましょう:

BufferedReader in = new BufferedReader(new FileReader("myFile.txt"));

これで、オブジェクトinはファイルに対して何らかのアクションを実行できますmyFile.txt。したがって、最初の行が必要だったとしましょうmyFile.txt:メソッドを使用しreadLine()ます。

BufferedReader in = new BufferedReader(new FileReader("myFile.txt"));
String line1 = in.readLine();

line1これで、ファイルの最初の行が含まれますmyfile.txt

ファイルの行全体を配列に書き込みたいとしましょう。あなたがしなければならないのは、whileループとEOFを番兵として使用することだけです。

ArrayList<String> fileLines = new ArrayList<String>();
BufferedReader in = new BufferedReader(new FileReader("myFile.txt"));
String currentLine = in.readLine();
while(currentLine != null){
    fileLines.add(currentLine);
    currentLine = in.readLine();
}

これは、ファイルのすべての行を読み取り、それを配列に書き込んで、さらに処理するために使用できるようにすることです。

ファイルへの書き込み

ここでは、の代わりにBufferedReaderを使用しPrintWriter、の代わりにFileReaderを使用しFileWriterます。

PrintWriter out = new PrintWriter(new PrintWriter("output.txt"));

これで、事前に作成されていない場合output.txt、プログラムは自動的に新しいものを作成します。

それで、それがどのように印刷されるかを見てみましょう:

String wiseSaying = "This is not a wise saying";
PrintWriter out = new PrintWriter(new PrintWriter("output.txt"));
out.println(wiseSaying);

これにより、の値がwiseSayingファイルに出力されますoutput.txt

完了したら、両方のファイルを閉じる必要があります。

in.close();
out.close();

outファイルを閉じないと、出力ファイルには何も表示されません。お役に立てれば。

于 2015-08-31T17:31:36.720 に答える
0

ここには2つの問題があります。

  1. ファイルの管理(存在しない場合は作成、存在する場合は追加)
  2. テキストの書き込みと読み取りが正しく行われていることを確認する

1)ファイルの管理

[この例ではJava6を想定していることに注意してください。Java 7を使用している場合は、リソースを試す機能を使用できます]

ファイルを読み取るときは、ファイルの存在を確認する必要があります。ただし、ファイルを書き込むときに、ファイルが存在する場合はファイルに追加するように指示するFileOutputStreamのコンストラクターを使用できます。


2)正しく読み書きする

堅牢なソリューションを得るには、文字エンコードの問題に注意する必要があります。リーダー/ライターフレームワーク全体が導入され、Stream実装(OutputStream / InputStreamなど)での文字エンコードの問題が修正されました。

デフォルトの文字エンコードが同じシステムで常にコードを実行する場合は、単純なFileWriter/FileReaderコンストラクターを使用する必要があります。ただし、(場合によっては)異なるデフォルトのエンコーディングで異なるOSを使用する場合は、使用するエンコーディングを指定する必要があります。これを行うには、ストリームと文字セットを受け取るOutputStreamWriterコンストラクターまたはInputStreamReaderコンストラクターを使用します。これにより、使用するエンコーディングを指定できます。


package org.foo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class FilesAndStrings {

    final static String[] STRINGS = {"One", "Two", "Three"};
    final static String FILE = "strings.txt";
    final static Charset UTF8_CHARSET = Charset.forName("UTF-8");

    public static void main(String[] args) throws IOException {
        // Single argument decides whether we write to the file or read from it
        if (args.length > 0) {
            String[] whatWeRead = readStrings();
            // Do something with whatWeRead
        }
        else {
            writeStrings();
        }
    }

    public static void writeStrings() throws FileNotFoundException {
        OutputStreamWriter out = null;
        BufferedWriter bw = null;
        PrintWriter pw = null;
        try {
            out = new OutputStreamWriter(new FileOutputStream(FILE, true), UTF8_CHARSET);
            bw = new BufferedWriter(out);
            pw = new PrintWriter(bw);
            for (String s : STRINGS) {
                pw.println(s);
            }
        }
        finally {
            tryToClose(pw);
            tryToClose(bw);
            tryToClose(out);
        }
    }

    public static String[] readStrings() throws IOException {
        InputStreamReader in = null;
        BufferedReader br = null;
        try {
            in = new InputStreamReader(new FileInputStream(FILE), UTF8_CHARSET);
            br = new BufferedReader(in);
            List<String> strings = new ArrayList<String>();
            String s = br.readLine();
            while (s != null) {
                strings.add(s);
                s = br.readLine();
            }
            return strings.toArray(new String[strings.size()]);
        }
        finally {
            tryToClose(br);
            tryToClose(in);
        }
    }

    public static void tryToClose(final Writer w) {
        try {
            w.close();
        }
        catch (IOException e) {
            // Log error
        }
    }

    public static void tryToClose(final Reader r) {
        try {
            r.close();
        }
        catch (IOException e) {
            // Log error
        }
    }
}

于 2012-12-26T22:39:01.223 に答える
0

ファイルに書き込むには、java.io.PrintWriterを使用します。

    File myFile= new File("db.txt");
    PrintWriter out = new PrintWriter(myFile);
    //Now use out.print() and out.println() just 
    //as you would use System.out.print() and System.out.println()
    out.print("test");
    out.println();
    out.close();

ファイルから読み取るには、java.io.Scannerを使用します。

    File myFile = new File("db.txt");
    Scanner s = new Scanner(myFile);
    String n = s.next(); //gets you the next token;
    String n = s.nextLine(); //gets you the next line as a string;
    s.close();
于 2012-12-26T21:33:18.637 に答える