ฉันจะสร้างไฟล์และเขียนลงใน Java ได้อย่างไร


1383

วิธีที่ง่ายที่สุดในการสร้างและเขียนไฟล์ (ข้อความ) ใน Java คืออะไร

คำตอบ:


1735

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

โปรดทราบว่าตัวอย่างโค้ดแต่ละตัวอย่างด้านล่างนี้จะเขียนทับไฟล์หากมีอยู่แล้ว

สร้างไฟล์ข้อความ:

PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();

การสร้างไฟล์ไบนารี:

byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();

ผู้ใช้Java 7+สามารถใช้Filesคลาสเพื่อเขียนไฟล์:

สร้างไฟล์ข้อความ:

List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

การสร้างไฟล์ไบนารี:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);

58
น่าสังเกตว่า PrintWriter จะตัดขนาดไฟล์เป็นศูนย์ถ้าไฟล์มีอยู่แล้ว
Covar

34
PrintWriter สามารถใช้ (และบ่อยครั้ง) ใช้ แต่ไม่ใช่ (แนวคิด) คลาสที่เหมาะสมสำหรับงาน จากเอกสาร: "PrintWriter prints formatted representations of objects to a text-output stream. "คำตอบของ Bozho นั้นถูกต้องมากขึ้นแม้ว่ามันจะดูยุ่งยาก (คุณสามารถห่อมันด้วยวิธียูทิลิตี้ได้เสมอ)
leonbloy

14
ดังนั้น textfile จะถูกสร้างขึ้นที่ไหนหลังจากที่แอพสร้างและใช้ในพีซีเครื่องอื่นเนื่องจากเรายังไม่ได้กำหนดพา ธ
Marlon Abeykoon

13
@MarlonAbeykoon เป็นคำถามที่ดี คำตอบก็คือว่ามันจะสร้างไฟล์ข้อความในไดเรกทอรีการทำงาน ไดเร็กตอรี่การทำงานคือไดเร็กตอรี่ที่คุณใช้เรียกใช้โปรแกรม ตัวอย่างเช่นหากคุณรันโปรแกรมของคุณจากบรรทัดคำสั่งไดเรกทอรีการทำงานจะเป็นไดเรกทอรีใด ๆ ที่คุณเป็น "ใน" ในขณะนั้น (บน Linux ให้พิมพ์ "pwd" เพื่อดูไดเรกทอรีการทำงานปัจจุบัน) หรือถ้าฉันคลิกสองครั้งที่ไฟล์ JAR บนเดสก์ท็อปของฉันเพื่อเรียกใช้ไดเรกทอรีการทำงานจะเป็นเดสก์ท็อป
ไมเคิล

8
writer.close()ควรอยู่ในช่วงท้ายบล็อก
ธีรี่ร์

416

ใน Java 7 ขึ้นไป:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream("filename.txt"), "utf-8"))) {
   writer.write("something");
}

มีสาธารณูปโภคที่เป็นประโยชน์สำหรับการที่แม้ว่า:

โปรดทราบว่าคุณสามารถใช้ a FileWriterแต่ใช้การเข้ารหัสเริ่มต้นซึ่งมักเป็นแนวคิดที่ไม่ดี - เป็นการดีที่สุดที่จะระบุการเข้ารหัสอย่างชัดเจน

ด้านล่างนี้เป็นคำตอบดั้งเดิมก่อนหน้า Java 7


Writer writer = null;

try {
    writer = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream("filename.txt"), "utf-8"));
    writer.write("Something");
} catch (IOException ex) {
    // Report
} finally {
   try {writer.close();} catch (Exception ex) {/*ignore*/}
}

ดูเพิ่มเติมที่: การอ่านการเขียนและการสร้างไฟล์ (รวมถึง NIO2)


5
@leonbloy ฉันรู้ว่านี่เป็นความคิดเห็นเก่า แต่ถ้าใครเห็นสิ่งนี้คุณจะอธิบายได้ไหมว่าทำไม "ไม่ได้ประโยชน์เสมอ"? อย่างน้อยนี่ก็บอกว่า "ด้านบนที่มีประสิทธิภาพ" docs.oracle.com/javase/1.5.0/docs/api/java/io/...

14
ดูเหมือนว่านักเขียนไม่มีวิธี writeln () มันมี แต่เขียน ()
YankeeWhiskey

10
หากคุณเปลี่ยนประเภทของนักเขียนเป็น BufferedWriter (ซึ่งจริง ๆ แล้ว) คุณสามารถใช้ writer.newLine () ได้
Niek

4
ดูเหมือนจะไม่ถูกต้องที่จะลอง / จับภายในในที่สุด ฉันรู้เหตุผลว่าทำไม แต่ดูเหมือนว่ามีกลิ่นรหัส
ashes999

4
@Typeot มันทำ การโทรclose()เข้าสตรีมใดก็ได้ที่พันรอบรายการอื่นจะเป็นการปิดสตรีมภายในทั้งหมดเช่นกัน
คดีฟ้องร้องกองทุนโมนิก้า

132

หากคุณมีเนื้อหาที่คุณต้องการเขียนไปยังไฟล์ (และไม่ได้สร้างขึ้นทันที) การjava.nio.file.Filesเพิ่มใน Java 7 ซึ่งเป็นส่วนหนึ่งของ I / O ดั้งเดิมจะให้วิธีที่ง่ายและมีประสิทธิภาพที่สุดในการบรรลุเป้าหมายของคุณ

โดยทั่วไปการสร้างและการเขียนไฟล์เป็นหนึ่งบรรทัดเท่านั้นยิ่งไปกว่านั้นวิธีการเรียกง่าย ๆ !

ตัวอย่างต่อไปนี้สร้างและเขียนถึง 6 ไฟล์ที่แตกต่างเพื่อแสดงวิธีใช้:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("1st line", "2nd line");
byte[] data = {1, 2, 3, 4, 5};

try {
    Files.write(Paths.get("file1.bin"), data);
    Files.write(Paths.get("file2.bin"), data,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    Files.write(Paths.get("file3.txt"), "content".getBytes());
    Files.write(Paths.get("file4.txt"), "content".getBytes(utf8));
    Files.write(Paths.get("file5.txt"), lines, utf8);
    Files.write(Paths.get("file6.txt"), lines, utf8,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
    e.printStackTrace();
}

ทำได้ดีมาก ฉันชอบตัวอย่าง file5 และ file6 ในการทดสอบ file6 ตรวจสอบให้แน่ใจว่าคุณรันโปรแกรมสองครั้งจากนั้นคุณจะเห็นโปรแกรมต่อท้ายบรรทัดอีกครั้ง
tazboy

76
public class Program {
    public static void main(String[] args) {
        String text = "Hello world";
        BufferedWriter output = null;
        try {
            File file = new File("example.txt");
            output = new BufferedWriter(new FileWriter(file));
            output.write(text);
        } catch ( IOException e ) {
            e.printStackTrace();
        } finally {
          if ( output != null ) {
            output.close();
          }
        }
    }
}

18
มันจะดีกว่าหรือไม่ที่จะใส่ output.close () ลงในบล็อกในที่สุด?
qed

7
รหัสเท่านั้นไม่สามารถประกอบคำตอบได้ที่นี่ คุณต้องอธิบาย
user207421

7
อันที่จริงสิ่งนี้จะไม่คอมไพล์output.close()พ่น IOException
Bob Yoplait

43

นี่คือตัวอย่างโปรแกรมเล็ก ๆ น้อย ๆ ในการสร้างหรือเขียนทับไฟล์ เป็นรุ่นยาวจึงสามารถเข้าใจได้ง่ายขึ้น

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class writer {
    public void writing() {
        try {
            //Whatever the file path is.
            File statText = new File("E:/Java/Reference/bin/images/statsTest.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);    
            Writer w = new BufferedWriter(osw);
            w.write("POTATO!!!");
            w.close();
        } catch (IOException e) {
            System.err.println("Problem writing to the file statsTest.txt");
        }
    }

    public static void main(String[]args) {
        writer write = new writer();
        write.writing();
    }
}

39

วิธีง่ายๆในการสร้างและเขียนไฟล์ใน Java:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CreateFiles {

    public static void main(String[] args) {
        try{
            // Create new file
            String content = "This is the content to write into create file";
            String path="D:\\a\\hi.txt";
            File file = new File(path);

            // If file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);

            // Write in file
            bw.write(content);

            // Close connection
            bw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}

7
File.exists()/createNewFile()รหัสที่นี่เป็นทั้งไม่มีจุดหมายและสิ้นเปลือง ระบบปฏิบัติการต้องทำสิ่งเดียวกันเมื่อnew FileWriter()สร้างแล้ว คุณกำลังบังคับให้มันเกิดขึ้นสองครั้ง
user207421

1
File.exists () / createNewFile () นั้นไม่มีจุดหมายและสิ้นเปลือง ฉันกำลังมองหาวิธีที่จะรันโค้ดที่ต่างกันโดยพิจารณาว่าไฟล์นั้นมีอยู่แล้วหรือไม่ สิ่งนี้มีประโยชน์มาก
KirstieBallance

2
ฉันใช้วิธีนี้ แต่คุณต้องรู้ว่ามันเขียนทับไฟล์ทุกครั้ง หากคุณต้องการให้ผนวกในกรณีที่ไฟล์มีอยู่คุณต้องสร้างอินสแตนซ์FileWriterดังต่อไปนี้:new FileWriter(file.getAbsoluteFile(),true)
Adelin

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

34

ใช้:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) {
    writer.write("text to write");
} 
catch (IOException ex) {
    // Handle me
}  

การใช้try()จะปิดกระแสโดยอัตโนมัติ รุ่นนี้สั้นเร็ว (บัฟเฟอร์) และเปิดใช้งานการเลือกการเข้ารหัส

คุณลักษณะนี้ถูกนำมาใช้ใน Java 7


5
ควรสังเกตว่านี่เป็นคุณสมบัติ Java 7 ดังนั้นจะไม่สามารถใช้งานได้ใน Java เวอร์ชันก่อนหน้า
วิหารแดน

3
หนึ่งสามารถใช้ "คงที่" StandardCharsets.UTF_8แทนสตริง "utf-8" (ซึ่งจะช่วยป้องกันข้อผิดพลาดจากการพิมพ์ผิด) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...- ได้java.nio.charset.StandardCharsetsรับการแนะนำใน java 7
Ralph

20

ที่นี่เรากำลังป้อนสตริงลงในไฟล์ข้อความ:

String content = "This is the content to write into a file";
File file = new File("filename.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close(); // Be sure to close BufferedWriter

เราสามารถสร้างไฟล์ใหม่และเพิ่มเนื้อหาลงไปได้อย่างง่ายดาย


โปรดทราบว่าการปิด BufferedWriter นั้นเพียงพอเพราะมันจะดูแลการปิด FileWriter ด้วย
rbaleksandar

17

เนื่องจากผู้เขียนไม่ได้ระบุว่าพวกเขาต้องการโซลูชันสำหรับ Java เวอร์ชันที่เป็น EoL หรือไม่ (โดยทั้ง Sun และ IBM และสิ่งเหล่านี้เป็นเทคนิคที่แพร่หลายมากที่สุด JVMs) และเนื่องจากข้อเท็จจริงที่ว่าคนส่วนใหญ่ดูเหมือนจะตอบ คำถามของผู้เขียนก่อนที่จะระบุว่ามันเป็นไฟล์ข้อความ (ไม่ใช่ไบนารี)ฉันได้ตัดสินใจที่จะให้คำตอบของฉัน


ก่อนอื่น Java 6 สิ้นสุดอายุการใช้งานโดยทั่วไปและเนื่องจากผู้เขียนไม่ได้ระบุว่าเขาต้องการความเข้ากันได้แบบดั้งเดิมฉันเดาว่าโดยอัตโนมัติหมายความว่า Java 7 หรือสูงกว่า (Java 7 ยังไม่ได้เป็น EoL โดย IBM) ดังนั้นเราสามารถดูได้ที่ไฟล์ I / O บทช่วยสอน: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

ก่อนการเปิดตัว Java SE 7 คลาส java.io.File เป็นกลไกที่ใช้สำหรับไฟล์ I / O แต่มีข้อเสียหลายประการ

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

โอ้ดีที่ออกกฎ java.io.File หากไม่สามารถเขียน / ต่อท้ายไฟล์ได้คุณอาจไม่สามารถรู้สาเหตุได้


เราสามารถดูบทแนะนำได้ที่: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common

หากคุณมีทุกบรรทัดที่คุณจะเขียน (ต่อท้าย) ลงในไฟล์ข้อความล่วงหน้าวิธีที่แนะนำคือ https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# เขียน java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-

นี่คือตัวอย่าง (ประยุกต์):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, StandardCharsets.UTF_8);

ตัวอย่างอื่น (ผนวก):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);

หากคุณต้องการเขียนเนื้อหาไฟล์ตามที่คุณไป : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-

ตัวอย่างแบบง่าย (Java 8 หรือสูงกว่า):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file)) {
    writer.append("Zero header: ").append('0').write("\r\n");
    [...]
}

ตัวอย่างอื่น (ผนวก):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
    writer.write("----------");
    [...]
}

วิธีการเหล่านี้ต้องการความพยายามเพียงเล็กน้อยในส่วนของผู้เขียนและควรเป็นที่ต้องการของผู้อื่นเมื่อเขียนไฟล์ [text]


'หากไฟล์ไม่สามารถเขียน / ต่อท้ายคุณอาจไม่สามารถรู้ได้ว่าทำไม "ไม่ถูกต้อง คุณจะรู้ว่าทำไมจากข้อความFileNotFoundExceptionที่ถูกโยนทิ้งเมื่อการดำเนินการล้มเหลว
user207421

"วิธีการหลายวิธีไม่ส่งข้อยกเว้นเมื่อล้มเหลวดังนั้นจึงเป็นไปไม่ได้ที่จะได้รับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ตัวอย่างเช่นหากการลบไฟล์ล้มเหลวโปรแกรมจะได้รับ" การลบล้มเหลว "แต่ไม่ทราบว่าเป็นเพราะ ไม่มีไฟล์อยู่ผู้ใช้ไม่มีสิทธิ์หรือมีปัญหาอื่น ๆ "
afk5min

อ่านสิ่งที่ฉันเขียน ' หากไฟล์ไม่สามารถเขียน / ต่อท้ายคุณอาจไม่สามารถรับข้อความแสดงข้อผิดพลาดที่มีประโยชน์' ไม่ถูกต้องด้วยเหตุผลที่ฉันระบุและยังคงอยู่ คุณกำลังเปลี่ยนหัวข้อ วิชาของคุณเอง
user207421

ฉันจะตรวจสอบการใช้งานในตัวสำหรับระบบไฟล์ทั่วไป (ที่จะอยู่ใน OpenJDK แต่ฉันไม่มีเหตุผลที่จะคิดว่าส่วนนี้จะแตกต่างกันใน Oracle JDK กรรมสิทธิ์หรือแตกต่างอย่างมีนัยสำคัญใน IBM JDK กรรมสิทธิ์ ฯลฯ ) คำตอบของฉันขึ้นอยู่กับสิ่งที่ค้นพบเหล่านี้ ความคิดเห็นของคุณสมเหตุสมผล - เนื่องจาก 'หลายวิธี' อาจมีปัญหาผู้เขียนระบุอย่างชัดเจนว่าเป็นเพียงการเขียน / ต่อท้ายการดำเนินการไฟล์ที่พวกเขาสนใจ
afk5min

เหตุผลก็คือว่าไม่มีวิธีการที่คุณโทรไม่สามารถโยนข้อยกเว้นที่เหมาะสมที่มีข้อความผิดพลาดที่เหมาะสม หากคุณมีตัวอย่างที่สนับสนุนการยืนยันของคุณมันขึ้นอยู่กับคุณที่จะให้มัน
user207421

16

หากคุณต้องการที่จะมีประสบการณ์ที่ค่อนข้างปราศจากความเจ็บปวดคุณยังสามารถมีลักษณะที่เป็นแพคเกจ Apache Commons IOมากขึ้นโดยเฉพาะในชั้นเรียนFileUtils

อย่าลืมตรวจสอบห้องสมุดบุคคลที่สาม Joda-Timeสำหรับการจัดการวันที่Apache Commons LangStringUtilsสำหรับการดำเนินการกับสตริงทั่วไปและสามารถทำให้โค้ดของคุณอ่านง่ายขึ้น

Java เป็นภาษาที่ยอดเยี่ยม แต่บางครั้งไลบรารี่มาตรฐานจะค่อนข้างต่ำ ทรงพลัง แต่ระดับต่ำอย่างไรก็ตาม


1
วิธีการเขียนไฟล์ที่ง่ายที่สุดในการมีFileUtils static void write(File file, CharSequence data)ตัวอย่างการใช้: import org.apache.commons.io.FileUtils; FileUtils.write(new File("example.txt"), "string with data");. FileUtilsยังมีwriteLinesซึ่งใช้Collectionเส้น
Rory O'Kane

12

หากคุณมีเหตุผลบางอย่างที่ต้องการแยกการกระทำของการสร้างและการเขียนเทียบเท่า Java touchคือ

try {
   //create a file named "testfile.txt" in the current working directory
   File myFile = new File("testfile.txt");
   if ( myFile.createNewFile() ) {
      System.out.println("Success!");
   } else {
      System.out.println("Failure!");
   }
} catch ( IOException ioe ) { ioe.printStackTrace(); }

createNewFile()ตรวจสอบการมีอยู่และไฟล์จะสร้างเป็นอะตอม สิ่งนี้มีประโยชน์หากคุณต้องการให้แน่ใจว่าคุณเป็นผู้สร้างไฟล์ก่อนที่จะเขียนลงไป


1
[แตะ] ยังอัปเดตการประทับเวลาของไฟล์เป็นผลข้างเคียง (หากมีอยู่แล้ว) สิ่งนี้มีผลข้างเคียงหรือไม่?
Ape-inago

@ Ape-inago: ในระบบของฉันมันไม่แน่นอน (มันแค่คืนเท็จและไม่มีผลกับไฟล์) ฉันไม่ได้หมายถึงtouchในความหมายทั่วไป แต่เป็นการใช้งานรองทั่วไปเพื่อสร้างไฟล์โดยไม่ต้องเขียนข้อมูลลงไป จุดประสงค์ของเอกสารแบบสัมผัสคือการอัพเดตการประทับเวลาของไฟล์ การสร้างไฟล์หากไม่มีอยู่นั้นเป็นผลข้างเคียงและสามารถปิดใช้งานได้ด้วยสวิตช์
Mark Peters

ด้วยเหตุผลบางอย่างเช่นอะไร exists()/createNewFile()ลำดับเหล่านี้เสียเวลาและพื้นที่อย่างแท้จริง
user207421

12

นี่คือวิธีที่เป็นไปได้ในการสร้างและเขียนไฟล์ใน Java:

ใช้ FileOutputStream

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
  bw.write("Write somthing to the file ...");
  bw.newLine();
  bw.close();
} catch (FileNotFoundException e){
  // File was not found
  e.printStackTrace();
} catch (IOException e) {
  // Problem when writing to the file
  e.printStackTrace();
}

ใช้ FileWriter

try {
  FileWriter fw = new FileWriter("myOutFile.txt");
  fw.write("Example of content");
  fw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

การใช้ PrintWriter

try {
  PrintWriter pw = new PrintWriter("myOutFile.txt");
  pw.write("Example of content");
  pw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

ใช้ OutputStreamWriter

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  osw.write("Soe content ...");
  osw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

ต่อการตรวจสอบการกวดวิชานี้เกี่ยวกับวิธีการอ่านและเขียนไฟล์ในชวา


แค่สงสัยว่า…ไม่ควรFileWriterหรือOutputStreamWriterปิดในบล็อกในที่สุด?
Wolfgang Schreurs

@ WolfgangSchreurs ใช่มันดีกว่าฉันต้องย้ายการประกาศตัวแปรนอกกลุ่มทดลองเพื่อให้สามารถทำเช่นนั้นได้
เมห์

ฉันเพิ่งค้นพบว่าการใช้งานการปิดอัตโนมัติถ้าทำความสะอาดไม่จำเป็นต้องประกาศตัวแปรนอกบล็อกและทรัพยากรจะถูกปิดโดยอัตโนมัติแม้ว่าจะมีข้อยกเว้นเกิดขึ้น (จำเป็นต้องเพิ่มบล็อกในที่สุดอย่างชัดเจน) ดู: docs.oracle.com/javase/tutorial/essential/exceptions/ …
Wolfgang Schreurs

ฉันจะเพิ่มลองกับทรัพยากรเป็นตัวอย่างที่แยกต่างหาก (เพื่อแยกความเป็นไปได้ที่แตกต่างกัน) คุณรู้ว่า SOF เป็นเว็บไซต์ความร่วมมือดำเนินการต่อและแก้ไขคำตอบหากคุณต้องการคุณมีสิทธิ์
เมห์

10

ใช้:

JFileChooser c = new JFileChooser();
c.showOpenDialog(c);
File writeFile = c.getSelectedFile();
String content = "Input the data here to be written to your file";

try {
    FileWriter fw = new FileWriter(writeFile);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(content);
    bw.append("hiiiii");
    bw.close();
    fw.close();
}
catch (Exception exc) {
   System.out.println(exc);
}

นี่เป็นวิธีที่ง่ายที่สุดที่ฉันพบ ... ปัญหาทั้งหมดได้รับการแก้ไขที่นี่และมีเพียงข้อความที่จำเป็นต้องใส่
Rohit ZP

10

วิธีที่ดีที่สุดคือการใช้ Java7: Java 7 แนะนำวิธีใหม่ในการทำงานกับระบบไฟล์พร้อมกับคลาสยูทิลิตี้ใหม่ - ไฟล์ เมื่อใช้คลาส Files เราสามารถสร้างย้ายคัดลอกลบไฟล์และไดเรกทอรีได้เช่นกัน มันยังสามารถใช้ในการอ่านและเขียนไฟล์

public void saveDataInFile(String data) throws IOException {
    Path path = Paths.get(fileName);
    byte[] strToBytes = data.getBytes();

    Files.write(path, strToBytes);
}

เขียนด้วย FileChannel หากคุณจัดการกับไฟล์ขนาดใหญ่ FileChannel สามารถเร็วกว่า IO มาตรฐาน รหัสต่อไปนี้เขียน String ไปยังไฟล์โดยใช้ FileChannel:

public void saveDataInFile(String data) 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    byte[] strBytes = data.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
}

เขียนด้วย DataOutputStream

public void saveDataInFile(String data) throws IOException {
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(data);
    outStream.close();
}

เขียนด้วย FileOutputStream

ตอนนี้เรามาดูวิธีที่เราสามารถใช้ FileOutputStream เพื่อเขียนข้อมูลไบนารีลงในไฟล์ รหัสต่อไปนี้แปลง String int ไบต์และเขียนไบต์ไปยังไฟล์โดยใช้ FileOutputStream:

public void saveDataInFile(String data) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = data.getBytes();
    outputStream.write(strToBytes);

    outputStream.close();
}

เขียนด้วย PrintWriter เราสามารถใช้ PrintWriter เพื่อเขียนข้อความที่จัดรูปแบบลงในไฟล์:

public void saveDataInFile() throws IOException {
    FileWriter fileWriter = new FileWriter(fileName);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Some String");
    printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
    printWriter.close();
}

เขียนด้วย BufferedWriter: ใช้ BufferedWriter เพื่อเขียน String ไปยังไฟล์ใหม่:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data);

    writer.close();
}

ผนวก String เข้ากับไฟล์ที่มีอยู่:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(data);

    writer.close();
}

9

ฉันคิดว่านี่เป็นวิธีที่สั้นที่สุด:

FileWriter fr = new FileWriter("your_file_name.txt"); // After '.' write
// your file extention (".txt" in this case)
fr.write("Things you want to write into the file"); // Warning: this will REPLACE your old file content!
fr.close();

8

วิธีสร้างไฟล์โดยไม่เขียนทับไฟล์ที่มีอยู่:

System.out.println("Choose folder to create file");
JFileChooser c = new JFileChooser();
c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
c.showOpenDialog(c);
c.getSelectedFile();
f = c.getSelectedFile(); // File f - global variable
String newfile = f + "\\hi.doc";//.txt or .doc or .html
File file = new File(newfile);

try {
    //System.out.println(f);
    boolean flag = file.createNewFile();

    if(flag == true) {
        JOptionPane.showMessageDialog(rootPane, "File created successfully");
    }
    else {
        JOptionPane.showMessageDialog(rootPane, "File already exists");
    }
    /* Or use exists() function as follows:
        if(file.exists() == true) {
            JOptionPane.showMessageDialog(rootPane, "File already exists");
        }
        else {
            JOptionPane.showMessageDialog(rootPane, "File created successfully");
        }
    */
}
catch(Exception e) {
    // Any exception handling method of your choice
}

7
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String [] args) {
        FileWriter fw= null;
        File file =null;
        try {
            file=new File("WriteFile.txt");
            if(!file.exists()) {
                file.createNewFile();
            }
            fw = new FileWriter(file);
            fw.write("This is an string written to a file");
            fw.flush();
            fw.close();
            System.out.println("File written Succesfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

exists()/createNewFile()ลำดับเหล่านี้เสียเวลาและพื้นที่อย่างแท้จริง
user207421

6
package fileoperations;
import java.io.File;
import java.io.IOException;

public class SimpleFile {
    public static void main(String[] args) throws IOException {
        File file =new File("text.txt");
        file.createNewFile();
        System.out.println("File is created");
        FileWriter writer = new FileWriter(file);

        // Writes the content to the file
        writer.write("Enter the text that you want to write"); 
        writer.flush();
        writer.close();
        System.out.println("Data is entered into file");
    }
}

exists()/createNewFile()ลำดับเหล่านี้เสียเวลาและพื้นที่อย่างแท้จริง
user207421

5

หนึ่งบรรทัดเท่านั้น! pathและlineเป็นสตริง

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

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

อะแฮ่มผู้เขียนระบุไฟล์ "text" อย่างชัดเจน และไฟล์ข้อความประกอบด้วยตัวอักษร ไฟล์ไบนารีประกอบด้วยไบต์ linesนอกเหนือจากที่มันยังไม่ชัดเจนสิ่งที่เป็น หากเป็น a การjava.lang.StringเรียกgetBytes()จะสร้างไบต์โดยใช้การเข้ารหัสเริ่มต้นของแพลตฟอร์มซึ่งไม่ดีมากในกรณีทั่วไป
afk5min

5

วิธีที่ง่ายที่สุดที่ฉันสามารถหาได้:

Path sampleOutputPath = Paths.get("/tmp/testfile")
try (BufferedWriter writer = Files.newBufferedWriter(sampleOutputPath)) {
    writer.write("Hello, world!");
}

อาจใช้งานได้กับ 1.7+ เท่านั้น


5

มันน่าลองสำหรับ Java 7+:

 Files.write(Paths.get("./output.txt"), "Information string herer".getBytes());

ดูเหมือนว่ามีแนวโน้ม ...


4

หากเราใช้ Java 7 ขึ้นไปและรู้เนื้อหาที่จะเพิ่ม (ต่อท้าย) ไปยังไฟล์เราสามารถใช้ประโยชน์จากวิธีการใหม่ของBufferedWriterในแพ็คเกจ NIO

public static void main(String[] args) {
    Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
    String text = "\n Welcome to Java 8";

    //Writing to the file temp.txt
    try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
        writer.write(text);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

มีกี่จุดที่ควรทราบ:

  1. มันก็มักจะเป็นนิสัยที่ดีในการระบุการเข้ารหัส charset StandardCharsetsและการที่เรามีอย่างต่อเนื่องในระดับ
  2. รหัสใช้try-with-resourceคำสั่งที่ทรัพยากรจะปิดโดยอัตโนมัติหลังจากลอง

แม้ว่า OP ไม่ได้ถาม แต่ในกรณีที่เราต้องการค้นหาบรรทัดที่มีคำหลักที่เฉพาะเจาะจงเช่นconfidentialเราสามารถใช้ประโยชน์จาก API สตรีมใน Java:

//Reading from the file the first line which contains word "confidential"
try {
    Stream<String> lines = Files.lines(FILE_PATH);
    Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
    if(containsJava.isPresent()){
        System.out.println(containsJava.get());
    }
} catch (IOException e) {
    e.printStackTrace();
}

4

การอ่านและการเขียนไฟล์โดยใช้อินพุตและเอาต์พุตสตรีม:

//Coded By Anurag Goel
//Reading And Writing Files
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class WriteAFile {
    public static void main(String args[]) {
        try {
            byte array [] = {'1','a','2','b','5'};
            OutputStream os = new FileOutputStream("test.txt");
            for(int x=0; x < array.length ; x++) {
                os.write( array[x] ); // Writes the bytes
            }
            os.close();

            InputStream is = new FileInputStream("test.txt");
            int size = is.available();

            for(int i=0; i< size; i++) {
                System.out.print((char)is.read() + " ");
            }
            is.close();
        } catch(IOException e) {
            System.out.print("Exception");
        }
    }
}


4

ใน Java 8 ให้ใช้ไฟล์และพา ธ และใช้โครงสร้างลองกับทรัพยากร

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

public class WriteFile{
    public static void main(String[] args) throws IOException {
        String file = "text.txt";
        System.out.println("Writing to file: " + file);
        // Files.newBufferedWriter() uses UTF-8 encoding by default
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file))) {
            writer.write("Java\n");
            writer.write("Python\n");
            writer.write("Clojure\n");
            writer.write("Scala\n");
            writer.write("JavaScript\n");
        } // the file will be automatically closed
    }
}

3

มีวิธีง่ายๆดังนี้:

File file = new File("filename.txt");
PrintWriter pw = new PrintWriter(file);

pw.write("The world I'm coming");
pw.close();

String write = "Hello World!";

FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);

fw.write(write);

fw.close();

bwไม่ได้ใช้
user207421

และไม่เขียนจุดของการเขียนทับไฟล์ที่มีเนื้อหาใหม่
user207421

3

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

File file = new File(System.*getProperty*("java.io.tmpdir") +
                     System.*getProperty*("file.separator") +
                     "YourFileName.txt");

2

การใช้ห้องสมุด Guava ของ Google ทำให้เราสามารถสร้างและเขียนไฟล์ได้อย่างง่ายดาย

package com.zetcode.writetofileex;

import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;

public class WriteToFileEx {

    public static void main(String[] args) throws IOException {

        String fileName = "fruits.txt";
        File file = new File(fileName);

        String content = "banana, orange, lemon, apple, plum";

        Files.write(content.getBytes(), file);
    }
}

ตัวอย่างสร้างfruits.txtไฟล์ใหม่ในไดเรกทอรีรูทโปรเจ็กต์


2

อ่านคอลเล็กชันกับลูกค้าและบันทึกเป็นไฟล์ด้วย JFilechooser

private void writeFile(){

    JFileChooser fileChooser = new JFileChooser(this.PATH);
    int retValue = fileChooser.showDialog(this, "Save File");

    if (retValue == JFileChooser.APPROVE_OPTION){

        try (Writer fileWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileChooser.getSelectedFile())))){

            this.customers.forEach((c) ->{
                try{
                    fileWrite.append(c.toString()).append("\n");
                }
                catch (IOException ex){
                    ex.printStackTrace();
                }
            });
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

2

มีอย่างน้อยหลายวิธีในการสร้างไฟล์และเขียนลงไป:

ไฟล์ขนาดเล็ก (1.7)

คุณสามารถใช้หนึ่งในวิธีการเขียนเพื่อเขียนไบต์หรือบรรทัดไปยังไฟล์

Path file = Paths.get("path-to-file");
byte[] buf = "text-to-write-to-file".;
Files.write(file, buf);

วิธีการเหล่านี้จะดูแลงานส่วนใหญ่ของคุณเช่นการเปิดและปิดการสตรีม แต่ไม่ได้มีไว้สำหรับจัดการไฟล์ขนาดใหญ่

การเขียนไฟล์ขนาดใหญ่โดยใช้ Buffered Stream I / O (1.7)

java.nio.fileแพคเกจสนับสนุนช่อง I / O ที่ข้อมูลการเคลื่อนไหวในบัฟเฟอร์ผ่านบางส่วนของชั้นที่สามารถสตรีมคอขวดของ I / O

String s = "much-larger-text-to-write-to-file";
try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
    writer.write(s, 0, s.length());
}

วิธีนี้เป็นสิ่งที่พิเศษเนื่องจากประสิทธิภาพที่มีประสิทธิภาพโดยเฉพาะอย่างยิ่งเมื่อดำเนินการเขียนเป็นจำนวนมาก การดำเนินการบัฟเฟอร์มีผลกระทบนี้เนื่องจากไม่จำเป็นต้องเรียกใช้วิธีการเขียนของระบบปฏิบัติการสำหรับทุกไบต์เดียวลดการดำเนินการ I / O ราคาแพง

ใช้ NIO API เพื่อคัดลอก (และสร้างใหม่) ไฟล์ที่มี Outputstream (1.7)

Path oldFile = Paths.get("existing-file-path");
Path newFile = Paths.get("new-file-path");
try (OutputStream os = new FileOutputStream(newFile.toFile())) {
    Files.copy(oldFile, os);
}

นอกจากนี้ยังมีวิธีการเพิ่มเติมที่อนุญาตให้คัดลอกไบต์ทั้งหมดจากอินพุตสตรีมไปยังไฟล์

FileWriter (ข้อความ) (<1.7)

เขียนลงในไฟล์โดยตรง (ประสิทธิภาพลดลง) และควรใช้เฉพาะเมื่อจำนวนการเขียนน้อยกว่า ใช้เพื่อเขียนข้อมูลเชิงอักขระไปยังไฟล์

String s= "some-text";
FileWriter fileWriter = new FileWriter("C:\\path\\to\\file\\file.txt");
fileWriter.write(fileContent);
fileWriter.close();

FileOutputStream (ไบนารี) (<1.7)

FileOutputStream มีไว้สำหรับเขียนสตรีมไบต์ดิบเช่นข้อมูลภาพ

byte data[] = "binary-to-write-to-file".getBytes();
FileOutputStream out = new FileOutputStream("file-name");
out.write(data);
out.close();

ด้วยวิธีการนี้เราควรพิจารณาที่จะเขียนอาร์เรย์ของไบต์เสมอแทนที่จะเขียนทีละหนึ่งไบต์ การเร่งความเร็วอาจมีนัยสำคัญมาก - สูงถึง 10 x หรือมากกว่า ดังนั้นจึงแนะนำให้ใช้write(byte[])วิธีการเมื่อทำได้

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