ฉันจะบันทึกสตริงลงในไฟล์ข้อความโดยใช้ Java ได้อย่างไร


699

ใน Java ฉันมีข้อความจากเขตข้อมูลข้อความในตัวแปร String ที่เรียกว่า "text"

ฉันจะบันทึกเนื้อหาของตัวแปร "text" ไปยังไฟล์ได้อย่างไร?

คำตอบ:


727

หากคุณเพียงแค่แสดงข้อความแทนที่จะเป็นข้อมูลไบนารี่ข้อมูลต่อไปนี้จะใช้ได้:

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

จากนั้นเขียนสตริงของคุณเช่นเดียวกับที่คุณทำกับสตรีมเอาต์พุตใด ๆ :

out.println(text);

คุณจะต้องจัดการข้อยกเว้นเช่นเคย โปรดโทรหาout.close()เมื่อคุณเขียนเสร็จแล้ว

หากคุณใช้ Java 7 หรือใหม่กว่าคุณสามารถใช้คำสั่ง " try-with-resources " ซึ่งจะปิดโดยอัตโนมัติPrintStreamเมื่อคุณทำเสร็จ (เช่นออกจากบล็อก) ดังนี้:

try (PrintWriter out = new PrintWriter("filename.txt")) {
    out.println(text);
}

คุณจะต้องโยนอย่างชัดเจนjava.io.FileNotFoundExceptionก่อนหน้านี้


4
@Justin คุณยังสามารถผ่านเส้นทางที่แน่นอน (เช่น "/tmp/filename.txt") เพื่อสร้าง FileOutputStream เพื่อบันทึกไฟล์ได้ทุกที่ที่คุณต้องการ
Jonik

7
Btw สิ่งนี้สามารถลดความซับซ้อนลงได้ด้วยตัวสร้างความสะดวกสบายที่ PrintStream มีมาตั้งแต่ 1.5 สิ่งนี้จะพอเพียง: PrintStream out = new PrintStream ("filename.txt");
Jonik

10
ต้องการปิดไฟล์แม้ว่าในบางจุด ... codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
คุณต้องการใช้ลอง {} catch () {} สุดท้าย {} ซึ่งในที่สุด {} คุณปิดไฟล์หากไม่เป็นโมฆะ
Benas

23
ใน java8 คุณสามารถลอง (PrintStream ps = new PrintStream ("filename")) {ps.println (out); } สิ่งนี้จะจัดการใกล้ชิดกับคุณ
Anton Chikin

245

Apache Commons IOมีวิธีการที่ยอดเยี่ยมสำหรับการทำเช่นนี้โดยเฉพาะอย่างยิ่ง FileUtils มีวิธีการดังต่อไปนี้:

static void writeStringToFile(File file, String data) 

ซึ่งอนุญาตให้คุณเขียนข้อความไปยังไฟล์ในการเรียกใช้เมธอดเดียว:

FileUtils.writeStringToFile(new File("test.txt"), "Hello File");

คุณอาจต้องการพิจารณาระบุการเข้ารหัสสำหรับไฟล์ด้วย


10
เพียงแค่การแก้ไขเล็กน้อยชิ้นส่วนที่สองควรอ่าน: FileUtils.writeStringToFile (ไฟล์ใหม่ ("test.txt"), "Hello File");
pm_labs

3
สำหรับพวกเราที่ชอบฝรั่งก็สามารถทำได้เช่นกัน
Jonik

10
ขณะนี้ฟังก์ชั่นเลิกใช้งานแล้วคุณควรเพิ่มชุดอักขระเริ่มต้น ->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
Paul Fournel

97

ดูที่Java File API

ตัวอย่างรวดเร็ว:

try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) {
    out.print(text);
}

@ XP1 ฉันรู้ว่ามันเป็นการปรับปรุงที่ดี ฉันใช้ลอมบอกสำหรับเรื่องนี้ใน Java 6: ไป@Cleanup new FileOutputStream(...)แล้วเสร็จ
Jorn

6
อย่าลืมโทรหาฟลัช (); จากนั้นออกมาปิด ();
Alex Byrth

@ AlexByrth ทำไมเขาควร?
Andrew Tobilko

1
ไฟล์ขนาดใหญ่จะถูกบันทึกในพื้นหลัง (เธรดอื่น) และใช้เวลาในการบันทึก การเรียก flush () ทำให้มั่นใจได้ว่าทุกอย่างถูกเขียนในบรรทัดถัดไป แต่นี่เป็นทางเลือกแต่เป็นแนวปฏิบัติที่ดีหากคุณจัดการกับไฟล์ขนาดใหญ่เป็นไฟล์บันทึก
Alex Byrth

1
โปรดทราบว่า out.close () ล้างสตรีมออกไปแล้วซึ่งหมายความว่าไม่จำเป็นต้องเรียก out.flush ()
hjk321

90

ใน Java 7 คุณสามารถทำได้:

String content = "Hello File!";
String path = "C:/a.txt";
Files.write( Paths.get(path), content.getBytes());

มีข้อมูลเพิ่มเติมได้ที่นี่: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403


3
ในกรณีที่มีคนสงสัยในภายหลังการเข้ารหัสจะเป็นมาตรฐานแพลตฟอร์ม
Haakon Løtveit

5
content.getBytes(StandardCharsets.UTF_8)สามารถใช้เพื่อกำหนดการเข้ารหัสอย่างชัดเจน
John29

1
โปรดทราบว่า StandardOpenOption.CREATE ไม่ใช่ค่าเริ่มต้นหนึ่ง StandardOpenOption.CREATE และ StandardOpenOption.TRUNCATE_EXISTING เป็นค่าเริ่มต้น หากต้องการใช้ค่าเริ่มต้นให้ลบพารามิเตอร์ที่สาม
Tinus Tate

โปรดดูความคิดเห็นของ Tinus Tate! กระบวนการแก้ไขตัวอย่างนี้เป็นอย่างไร ฉันสงสัยว่ามีคนหลายพันคนที่นำตัวอย่างนี้ไปใช้เพื่อพบว่าพวกเขามีผลลัพธ์ที่ไม่คาดคิดเมื่อพวกเขาเขียนทับไฟล์ด้วยสตริงที่สั้นกว่า ดังที่ Tinus บ่งชี้ว่า TRUNCATE_EXISTING มีความสำคัญเว้นแต่คุณจะเข้าใจและมีเหตุผลจริงที่ไม่ต้องการตัดทอนไฟล์ที่มีอยู่เมื่อทำการเขียนทับด้วยสตริงที่สั้นกว่า
jch

1
ในจาวา 11 คุณสามารถใส่สตริงเป็นพารามิเตอร์ตัวที่สอง! ไชโย!
Dennis Glot

78

ทำสิ่งที่คล้ายกันในโครงการของฉัน ใช้FileWriterจะทำให้งานของคุณง่ายขึ้น และที่นี่คุณสามารถค้นหาความสุขกวดวิชา

BufferedWriter writer = null;
try
{
    writer = new BufferedWriter( new FileWriter( yourfilename));
    writer.write( yourstring);

}
catch ( IOException e)
{
}
finally
{
    try
    {
        if ( writer != null)
        writer.close( );
    }
    catch ( IOException e)
    {
    }
}

4
การลบทั้งหมดลอง / จับและทำให้มันง่ายขึ้นฉันยังสามารถทำได้ในหนึ่งบรรทัดโดยทำดังนี้: (ใหม่ BufferedWriter (ใหม่ FileWriter (ชื่อไฟล์))) เขียน (str);
Artem Barger

6
ดังนั้นแสดงทางออกที่ง่ายและดีของคุณ ฉันยินดีที่จะเรียนรู้วิธีการทำในวิธีที่ดีกว่า
Artem Barger

4
ไม่สนใจโทรลล์ ... พวกเขาวิจารณ์โดยไม่ต้องเสนอทางออก ขอบคุณที่ช่วยฉันจากการเขียนโค้ดของตัวเอง / ดาวน์โหลด
ไลบรารี่

1
ดูเหมือนว่า.close()จะไม่โยน (อย่างน้อยใน Java 7?) เป็นครั้งสุดท้ายที่พยายามซ้ำซ้อน?
Kos

16
การกลืนข้อยกเว้นเช่นนั้นจะทำให้ชีวิตลำบากสำหรับคุณเมื่อเกิดข้อยกเว้นขึ้นจริง อย่างน้อยที่สุดคุณควรสร้างใหม่:throw new RuntimeException(e);
Roger Keays

65

ใช้FileUtils.writeStringToFile()จากApache Commons IO ไม่จำเป็นต้องบูรณาการล้อนี้โดยเฉพาะ


20
ฉันไม่เห็นด้วยมากกว่านี้ ห้องสมุดเหล่านี้อยู่ที่นั่นดังนั้นเราจึงไม่แนะนำข้อบกพร่องที่ละเอียดอ่อนในวิธีแก้ปัญหาง่ายๆ
skaffman

3
ไม่เห็นได้ชัดว่าไม่ ฉันแค่ไม่เห็นด้วยที่ทางออกของคุณอาจไม่ใช่สิ่งแรกที่ฉันจะโยนให้คนที่เป็นโปรแกรมเมอร์ Java มือใหม่ คุณไม่ได้แนะนำว่าคุณไม่เคยเขียนสิ่งนี้มาใช่มั้ย
duffymo

8
ฉันเคยใช่ แต่นั่นก่อนที่ฉันจะพบคอมมอนส์ -o ตั้งแต่พบว่าฉันไม่เคยเขียนอะไรแบบนั้นมาก่อนแม้แต่ในโครงการชั้นเดียว ถ้าฉันรู้ตั้งแต่วันแรกฉันจะใช้มันตั้งแต่วันแรก
skaffman

5
แน่นอน แต่คุณเป็นนักพัฒนาที่มีประสบการณ์ ประวัติของคุณกล่าวว่าผู้ใช้ JBOSS / Spring ของคุณ แต่แน่นอนว่าคุณจะไม่ได้รับความพยายามในการ "Hello, World" ครั้งแรก ฉันไม่เห็นด้วยกับการใช้ห้องสมุดที่เหมาะสม ฉันกำลังบอกว่าคนที่พยายามใช้ภาษาเป็นครั้งแรกควรพยายามที่จะรู้ว่าที่ด้านล่างแม้ว่าจะหมายถึงการทำสิ่งที่พวกเขาจะทิ้งในภายหลังเมื่อพวกเขามีประสบการณ์และรู้ดีกว่า
duffymo

2
ฉันใช้สิ่งนี้โดยไม่มีคอมมอนส์และได้รับข้อยกเว้นที่น้อยกว่าอย่างเห็นได้ชัด จากนั้นฉันก็ใช้สิ่งนี้โดยใช้คอมมอนส์และมันบอกฉันว่าอะไรผิด คุณธรรมของเรื่องราว: ทำไมต้องอยู่ในยุคมืดถ้าคุณไม่ต้องทำ?
SilentNot

22

คุณสามารถใช้การแก้ไขโค้ดด้านล่างเพื่อเขียนไฟล์ของคุณจากคลาสหรือฟังก์ชั่นใดก็ตามที่จัดการข้อความ สิ่งหนึ่งที่สงสัยว่าทำไมโลกถึงต้องการเครื่องมือแก้ไขข้อความใหม่ ...

import java.io.*;

public class Main {

    public static void main(String[] args) {

        try {
            String str = "SomeMoreTextIsHere";
            File newTextFile = new File("C:/thetextfile.txt");

            FileWriter fw = new FileWriter(newTextFile);
            fw.write(str);
            fw.close();

        } catch (IOException iox) {
            //do stuff with exception
            iox.printStackTrace();
        }
    }
}

2
ไม่ได้ปิดไฟล์ในกรณีที่มีข้อยกเว้น
Tom Hawtin - tackline

1
@JanusTroelsen: ถ้าปฏิเสธอ้างงบลองกับทรัพยากร
trashgod

22

ในJava 11java.nio.file.Filesระดับได้ขยายโดยสองวิธียูทิลิตี้ใหม่จะเขียนสตริงลงในไฟล์ วิธีแรก (ดู JavaDoc ที่นี่ ) ใช้ชุดอักขระUTF-8เป็นค่าเริ่มต้น:

Files.writeString(Path.of("my", "path"), "My String");

และวิธีที่สอง (ดู JavaDoc ที่นี่ ) อนุญาตให้ระบุชุดอักขระแต่ละชุด:

Files.writeString(Path.of("my", "path"), "My String", StandardCharset.ISO_8859_1);

ทั้งสองวิธีมีพารามิเตอร์ Varargs ซึ่งเป็นตัวเลือกสำหรับการตั้งค่าตัวเลือกการจัดการไฟล์ (ดู JavaDoc ที่นี่ ) ตัวอย่างต่อไปนี้จะสร้างไฟล์ที่ไม่มีอยู่หรือต่อท้ายสตริงกับไฟล์ที่มีอยู่:

Files.writeString(Path.of("my", "path"), "String to append", StandardOpenOption.CREATE, StandardOpenOption.APPEND);

13

ฉันชอบที่จะพึ่งพาห้องสมุดทุกครั้งที่เป็นไปได้สำหรับการดำเนินการประเภทนี้ สิ่งนี้ทำให้ฉันมีโอกาสน้อยที่จะไม่ได้ตั้งใจทำขั้นตอนสำคัญโดยไม่ตั้งใจ (เช่นข้อผิดพลาดของ ห้องสมุดบางคนมีข้อเสนอแนะข้างต้น แต่ที่ชื่นชอบสำหรับชนิดของสิ่งนี้คือGoogle ฝรั่ง Guava มีคลาสที่ชื่อว่าFilesซึ่งทำงานได้ดีสำหรับงานนี้:

// This is where the file goes.
File destination = new File("file.txt");
// This line isn't needed, but is really useful 
// if you're a beginner and don't know where your file is going to end up.
System.out.println(destination.getAbsolutePath());
try {
    Files.write(text, destination, Charset.forName("UTF-8"));
} catch (IOException e) {
    // Useful error handling here
}

2
หากคุณใช้ Guava ก็มีเช่นCharsets.UTF-8กัน
florian

2
@florian: Charsets.UTF_8จริง ๆ แล้ว
ทิมBüthe

โฟลเดอร์หลักจะต้องมีอยู่ ตัวอย่าง: destination.mkdirs ()
AlikElzin-kilaka

2
Files.write (CharSequence from, File to, Charset charset) เลิกใช้แล้วใน guava 26.0
Donald Duck

ทางเลือกฝรั่งสมัยใหม่เพื่อคัดค้าน Files.write: Files.asCharSink(file, charset).write(text)
Vadzim

12

ใช้ Apache Commons IO api มันง่ายมาก

ใช้ API เป็น

 FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");

Maven พึ่งพา

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

12

ในกรณีที่คุณต้องการสร้างไฟล์ข้อความโดยใช้สตริงเดียว:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class StringWriteSample {
    public static void main(String[] args) {
        String text = "This is text to be saved in file";

        try {
            Files.write(Paths.get("my-file.txt"), text.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Files.write (เส้นทาง, ไบต์ []) จะใช้การเข้ารหัส UTF-8 String.getBytes () ใช้การเข้ารหัสแพลตฟอร์มเริ่มต้น ดังนั้นนี่คือปัญหาที่อาจเกิดขึ้น ใช้ string.getBytes (StandardCharsets.UTF_8)!
rmuller

11

ใช้สิ่งนี้มันสามารถอ่านได้มาก:

import java.nio.file.Files;
import java.nio.file.Paths;

Files.write(Paths.get(path), lines.getBytes(), StandardOpenOption.WRITE);

เป็นสำเนาของคำตอบที่มีอยู่ : c
james.garriss

2
ขออภัยฉันไม่ได้ประดิษฐ์ java8 ฉันไม่ใช่คนเดียวที่ใช้บรรทัดนี้ แต่ไม่ใช่สำเนาที่ผ่านมาจากคำตอบอื่น ๆ สำหรับคำถามเดียวกัน
Ran Adler

10
import java.io.*;

private void stringToFile( String text, String fileName )
 {
 try
 {
    File file = new File( fileName );

    // if file doesnt exists, then create it 
    if ( ! file.exists( ) )
    {
        file.createNewFile( );
    }

    FileWriter fw = new FileWriter( file.getAbsoluteFile( ) );
    BufferedWriter bw = new BufferedWriter( fw );
    bw.write( text );
    bw.close( );
    //System.out.println("Done writing to " + fileName); //For testing 
 }
 catch( IOException e )
 {
 System.out.println("Error: " + e);
 e.printStackTrace( );
 }
} //End method stringToFile

คุณสามารถแทรกวิธีนี้ในชั้นเรียนของคุณ หากคุณใช้วิธีนี้ในคลาสที่มีวิธีการหลักให้เปลี่ยนคลาสนี้เป็นแบบคงที่โดยเพิ่มคำสำคัญแบบคงที่ ไม่ว่าด้วยวิธีใดคุณจะต้องนำเข้า java.io. * เพื่อให้ใช้งานได้มิฉะนั้นจะไม่รู้จัก File, FileWriter และ BufferedWriter


10

คุณสามารถทำได้:

import java.io.*;
import java.util.*;

class WriteText
{
    public static void main(String[] args)
    {   
        try {
            String text = "Your sample content to save in a text file.";
            BufferedWriter out = new BufferedWriter(new FileWriter("sample.txt"));
            out.write(text);
            out.close();
        }
        catch (IOException e)
        {
            System.out.println("Exception ");       
        }

        return ;
    }
};

10

การใช้Java 7:

public static void writeToFile(String text, String targetFilePath) throws IOException
{
    Path targetPath = Paths.get(targetFilePath);
    byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
    Files.write(targetPath, bytes, StandardOpenOption.CREATE);
}

คำที่ฉลาด - นี้จะสร้างไฟล์ใหม่ถ้ามันไม่ได้มี แต่จะเขียนทับตัวละครของไฟล์ที่มีอยู่ถ้ามันเป็น หากข้อมูลใหม่มีขนาดเล็กลงนั่นหมายความว่าคุณอาจสร้างไฟล์ที่เสียหาย ถามฉันว่าฉันรู้!
Chris Rae

ตกลงคุณรู้ได้อย่างไร
ojblass

เพียงใช้Files.write(targetPath, bytes);เพื่อเขียนทับไฟล์นั้น มันจะทำงานได้ตามที่คาดไว้
BullyWiiPlaza


6

หากคุณสนใจที่จะส่งข้อความไปยังไฟล์เดียวบล็อกนี้จะเขียนทับทุกครั้ง

JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
    FileOutputStream stream = null;
    PrintStream out = null;
    try {
        File file = chooser.getSelectedFile();
        stream = new FileOutputStream(file); 
        String text = "Your String goes here";
        out = new PrintStream(stream);
        out.print(text);                  //This will overwrite existing contents

    } catch (Exception ex) {
        //do something
    } finally {
        try {
            if(stream!=null) stream.close();
            if(out!=null) out.close();
        } catch (Exception ex) {
            //do something
        }
    }
}

ตัวอย่างนี้อนุญาตให้ผู้ใช้เลือกไฟล์โดยใช้ตัวเลือกไฟล์


@Eric Leschinski: ขอบคุณที่ทำให้คำตอบของฉันเป็นมืออาชีพมากขึ้น (ฉันยังสันนิษฐานว่านี่เป็นสิ่งที่ OP ต้องการเพราะนี่คือสิ่งที่คนส่วนใหญ่ต้องการจริงๆเพียงแค่ทิ้งข้อความและแทนที่มัน)
bhathiya-perera

2
เมื่อตอบคำถามเดิมแล้วและ OP พอใจและยาวขึ้นหน้าเว็บนี้จะทำหน้าที่เป็นสิ่งประดิษฐ์ที่มีประโยชน์สำหรับผู้ที่มาที่นี่จากการค้นหาของ Google เท่านั้น ฉันลงจอดบนหน้านี้เพื่อสร้างตัวต่อท้ายข้อความขนาดเล็กให้กับไฟล์ ดังนั้นจึงเป็นการดีที่จะพูดกับผู้ชมทั้งหมดแทนที่จะเป็น OP หลังจากที่ OP ดำเนินต่อไป
Eric Leschinski

3

เป็นการดีกว่าที่จะปิดตัวเขียน / เอาต์พุตในบล็อกสุดท้ายในกรณีที่มีบางอย่างเกิดขึ้น

finally{
   if(writer != null){
     try{
        writer.flush();
        writer.close();
     }
     catch(IOException ioe){
         ioe.printStackTrace();
     }
   }
}

1
ดียิ่งขึ้น: ใช้การทดลองกับทรัพยากร
Janus Troelsen

ใช่ @JanusTroelsen ถูกต้องดีกว่าใช้คำสั่งลองกับทรัพยากรdocs.oracle.com/javase/tutorial/essential/exceptions/…

2
private static void generateFile(String stringToWrite, String outputFile) {
try {       
    FileWriter writer = new FileWriter(outputFile);
    writer.append(stringToWrite);
    writer.flush();
    writer.close();
    log.debug("New File is generated ==>"+outputFile);
} catch (Exception exp) {
    log.error("Exception in generateFile ", exp);
}

}


1
ในขณะที่ข้อมูลโค้ดนี้อาจเป็นโซลูชันรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพการโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
Johan

อาจจะไม่ถูกเรียกว่า close () โปรดปรับปรุงคำตอบของคุณโดยเพิ่มการจัดการกรณีข้อผิดพลาดที่เหมาะสม
Boris Brodski

0

ฉันคิดว่าวิธีที่ดีที่สุดคือใช้Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options):

String text = "content";
Path path = Paths.get("path", "to", "file");
Files.write(path, Arrays.asList(text));

ดูjavadoc :

เขียนบรรทัดของข้อความไปยังไฟล์ แต่ละบรรทัดเป็นลำดับถ่านและถูกเขียนไปยังไฟล์ตามลำดับโดยแต่ละบรรทัดถูกยกเลิกโดยตัวแยกบรรทัดของแพลตฟอร์มตามที่กำหนดโดยคุณสมบัติของระบบ line.separator อักขระถูกเข้ารหัสเป็นไบต์โดยใช้ชุดอักขระที่ระบุ

พารามิเตอร์ options ระบุวิธีการสร้างหรือเปิดไฟล์ หากไม่มีตัวเลือกอยู่วิธีนี้จะทำงานเหมือนกับว่ามีตัวเลือก CREATE, TRUNCATE_EXISTING และ WRITE กล่าวอีกนัยหนึ่งมันจะเปิดไฟล์สำหรับการเขียนการสร้างไฟล์หากไม่มีอยู่หรือเริ่มต้นการตัดทอนไฟล์ปกติที่มีอยู่ให้มีขนาดเท่ากับ 0 วิธีนี้ทำให้มั่นใจได้ว่าไฟล์จะถูกปิดเมื่อเขียนทุกบรรทัด ( หรือข้อผิดพลาด I / O หรือข้อผิดพลาดรันไทม์อื่น ๆ ถูกส่งออกไป) หากเกิดข้อผิดพลาด I / O อาจเกิดขึ้นหลังจากไฟล์ถูกสร้างขึ้นหรือถูกตัดทอนหรือหลังจากนั้นบางไบต์ได้ถูกเขียนไปยังไฟล์

โปรดทราบว่า ฉันเห็นผู้คนตอบแล้วด้วย Java ที่มีอยู่แล้วFiles.writeแต่สิ่งที่พิเศษในคำตอบของฉันที่ไม่มีใครพูดถึงคือรุ่นที่โอเวอร์โหลดของวิธีที่ใช้ Iterable ของ CharSequence (เช่น String) แทนที่จะเป็นbyte[]อาร์เรย์ดังนั้นจึงtext.getBytes()ไม่จำเป็น ซึ่งฉันคิดว่าสะอาดกว่าเล็กน้อย


0

หากคุณต้องการเก็บอักขระขึ้นบรรทัดใหม่จากสตริงลงในไฟล์ที่นี่เป็นตัวอย่างรหัส:

    jLabel1 = new JLabel("Enter SQL Statements or SQL Commands:");
    orderButton = new JButton("Execute");
    textArea = new JTextArea();
    ...


    // String captured from JTextArea()
    orderButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            // When Execute button is pressed
            String tempQuery = textArea.getText();
            tempQuery = tempQuery.replaceAll("\n", "\r\n");
            try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/tempQuery.sql"))) {
                out.print(tempQuery);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(tempQuery);
        }

    });

-1

วิธีของฉันขึ้นอยู่กับกระแสข้อมูลเนื่องจากการทำงานบน Android ทุกรุ่นและความต้องการทรัพยากร fecthing เช่น URL / URI ข้อเสนอแนะใด ๆ ยินดีต้อนรับ

เท่าที่เกี่ยวข้องสตรีม (InputStream และ OutputStream) ถ่ายโอนข้อมูลไบนารีเมื่อนักพัฒนาไปเขียนสตริงลงในสตรีมก่อนอื่นต้องแปลงเป็นไบต์หรือพูดอีกอย่างหนึ่งว่าเข้ารหัส

public boolean writeStringToFile(File file, String string, Charset charset) {
    if (file == null) return false;
    if (string == null) return false;
    return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}

public boolean writeBytesToFile(File file, byte[] data) {
    if (file == null) return false;
    if (data == null) return false;
    FileOutputStream fos;
    BufferedOutputStream bos;
    try {
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(data, 0, data.length);
        bos.flush();
        bos.close();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return false;
    }
    return true;
}

1
โปรดเพิ่มการจัดการกรณีข้อผิดพลาดที่เหมาะสมปิดทรัพยากรที่เปิดอยู่ทั้งหมดและให้การยกเว้น
Boris Brodski

คุณต้องการแบ่งปันรหัสการจัดการเคสตามที่คุณแนะนำหรือไม่ขอบคุณ
牟家宏

-1

คุณสามารถใช้ ArrayList เพื่อใส่เนื้อหาทั้งหมดของ TextArea สำหรับตัวอย่างและส่งเป็นพารามิเตอร์โดยการเรียกบันทึกเป็นนักเขียนเพียงแค่เขียนสายสตริงจากนั้นเราจะใช้ "สำหรับ" บรรทัดโดยเขียน ArrayList ของเราในตอนท้าย เราจะเป็นเนื้อหา TextArea ในไฟล์ txt หากสิ่งที่ไม่สมเหตุสมผลฉันขอโทษ Google แปลและฉันที่ไม่พูดภาษาอังกฤษ

ดู Windows Notepad มันไม่ได้ข้ามเส้นเสมอไปและแสดงทั้งหมดในบรรทัดเดียวใช้ Wordpad ok


private void SaveActionPerformed(java.awt.event.ActionEvent evt) {

    String NameFile = Name.getText();
    ArrayList< String > Text = new ArrayList< String >();

    Text.add(TextArea.getText());

    SaveFile(NameFile, Text);
}

public void SaveFile(String name, ArrayList< String> message) {

    path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";

    File file1 = new File(path);

    try {

        if (!file1.exists()) {

            file1.createNewFile();
        }


        File[] files = file1.listFiles();


        FileWriter fw = new FileWriter(file1, true);

        BufferedWriter bw = new BufferedWriter(fw);

        for (int i = 0; i < message.size(); i++) {

            bw.write(message.get(i));
            bw.newLine();
        }

        bw.close();
        fw.close();

        FileReader fr = new FileReader(file1);

        BufferedReader br = new BufferedReader(fr);

        fw = new FileWriter(file1, true);

        bw = new BufferedWriter(fw);

        while (br.ready()) {

            String line = br.readLine();

            System.out.println(line);

            bw.write(line);
            bw.newLine();

        }
        br.close();
        fr.close();

    } catch (IOException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, "Error in" + ex);     
    }   
}

คุณอาจเปิดทรัพยากรจำนวนมากทิ้งไว้ นี่เป็นวิธีปฏิบัติที่ไม่ดีโปรดอย่าทำเช่นนี้
Boris Brodski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.