大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java文件寫入的方法

Java文件寫入的方法

更新時間:2022-07-28 11:10:50 來源:動力節點 瀏覽1733次

1. 概述

在本Java教程中,我們將探索使用 Java 寫入文件的不同方法。我們將使用BufferedWriter、PrintWriter、FileOutputStream、DataOutputStream、RandomAccessFile、FileChannel和 Java 7 Files實用程序類。

我們還將研究在寫入時鎖定文件,并討論寫入文件的一些最終要點。

本教程是Baeldung 上的 Java“回歸基礎”系列的一部分。

2. 使用BufferedWriter寫入

讓我們從簡單開始,使用BufferedWriter將String寫入新文件:

public void whenWriteStringUsingBufferedWritter_thenCorrect() 
  throws IOException {
    String str = "Hello";
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(str);    
    writer.close();
}

文件中的輸出將是:

Hello

然后我們可以將字符串附加到現有文件:

@Test
public void whenAppendStringUsingBufferedWritter_thenOldContentShouldExistToo() 
  throws IOException {
    String str = "World";
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(str);    
    writer.close();
}

該文件將是:

Hello World

3. 使用PrintWriter編寫

接下來,讓我們看看如何使用PrintWriter將格式化文本寫入文件:

@Test
public void givenWritingStringToFile_whenUsingPrintWriter_thenCorrect() 
  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();
}

生成的文件將包含:

Some String
Product name is iPhone and its price is 1000$

請注意,我們不僅將原始字符串寫入文件,而且還使用printf方法寫入了一些格式化文本。

我們可以使用FileWriter、BufferedWriter甚至System.out創建 writer 。

4. 使用FileOutputStream寫入

現在讓我們看看如何使用FileOutputStream將二進制數據寫入文件。

以下代碼將String轉換為字節并使用FileOutputStream將字節寫入文件:

@Test
public void givenWritingStringToFile_whenUsingFileOutputStream_thenCorrect() 
  throws IOException {
    String str = "Hello";
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = str.getBytes();
    outputStream.write(strToBytes);
    outputStream.close();
}

文件中的輸出當然是:

Hello

5. 使用DataOutputStream寫入

接下來,讓我們看一下如何使用DataOutputStream將String寫入文件:

@Test
public void givenWritingToFile_whenUsingDataOutputStream_thenCorrect() 
  throws IOException {
    String value = "Hello";
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(value);
    outStream.close();
    // verify the results
    String result;
    FileInputStream fis = new FileInputStream(fileName);
    DataInputStream reader = new DataInputStream(fis);
    result = reader.readUTF();
    reader.close();
    assertEquals(value, result);
}

6. 使用RandomAccessFile寫入

現在讓我們說明如何在現有文件中寫入和編輯,而不僅僅是寫入一個全新的文件或附加到現有文件。簡單地說:我們需要隨機訪問。

RandomAccessFile使我們能夠在給定偏移量的文件中的特定位置寫入 - 從文件的開頭 - 以字節為單位。

此代碼寫入一個整數值,偏移量從文件開頭給出:

private void writeToPosition(String filename, int data, long position) 
  throws IOException {
    RandomAccessFile writer = new RandomAccessFile(filename, "rw");
    writer.seek(position);
    writer.writeInt(data);
    writer.close();
}

如果我們想讀取存儲在特定位置的int,我們可以使用這個方法:

private int readFromPosition(String filename, long position) 
  throws IOException {
    int result = 0;
    RandomAccessFile reader = new RandomAccessFile(filename, "r");
    reader.seek(position);
    result = reader.readInt();
    reader.close();
    return result;
}

為了測試我們的函數,讓我們寫一個整數,編輯它,最后讀回它:

@Test
public void whenWritingToSpecificPositionInFile_thenCorrect() 
  throws IOException {
    int data1 = 2014;
    int data2 = 1500;    
    writeToPosition(fileName, data1, 4);
    assertEquals(data1, readFromPosition(fileName, 4));    
    writeToPosition(fileName2, data2, 4);
    assertEquals(data2, readFromPosition(fileName, 4));
}

7. 使用FileChannel寫入

如果我們正在處理大文件,FileChannel可以比標準 IO 更快。以下代碼使用FileChannel將String寫入文件:

@Test
public void givenWritingToFile_whenUsingFileChannel_thenCorrect() 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    String value = "Hello";
    byte[] strBytes = value.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
    // verify
    RandomAccessFile reader = new RandomAccessFile(fileName, "r");
    assertEquals(value, reader.readLine());
    reader.close();
}

8. 使用文件類編寫

Java 7 引入了一種使用文件系統的新方法,以及一個新的實用程序類:Files。

使用Files類,我們可以創建、移動、復制和刪除文件和目錄。它還可以用于讀取和寫入文件:

@Test
public void givenUsingJava7_whenWritingToFile_thenCorrect() 
  throws IOException {
    String str = "Hello";
    Path path = Paths.get(fileName);
    byte[] strToBytes = str.getBytes();
    Files.write(path, strToBytes);
    String read = Files.readAllLines(path).get(0);
    assertEquals(str, read);
}

9. 寫入臨時文件

現在讓我們嘗試寫入一個臨時文件。以下代碼創建一個臨時文件并向其中寫入一個字符串:

@Test
public void whenWriteToTmpFile_thenCorrect() throws IOException {
    String toWrite = "Hello";
    File tmpFile = File.createTempFile("test", ".tmp");
    FileWriter writer = new FileWriter(tmpFile);
    writer.write(toWrite);
    writer.close();
    BufferedReader reader = new BufferedReader(new FileReader(tmpFile));
    assertEquals(toWrite, reader.readLine());
    reader.close();
}

正如我們所見,有趣和不同的只是臨時文件的創建。在那之后,寫入文件是相同的。

10. 寫入前鎖定文件

最后,在寫入文件時,我們有時需要額外確保沒有其他人同時寫入該文件。基本上,我們需要能夠在寫入時鎖定該文件。

讓我們使用FileChannel在寫入之前嘗試鎖定文件:

@Test
public void whenTryToLockFile_thenItShouldBeLocked() 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    FileLock lock = null;
    try {
        lock = channel.tryLock();
    } catch (final OverlappingFileLockException e) {
        stream.close();
        channel.close();
    }
    stream.writeChars("test lock");
    lock.release();
    stream.close();
    channel.close();
}

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 99热这里只有精品1 99热这里只有精品18 | 欧美成人全部免费观看1314色 | 一道本免费视频 | 亚洲+自拍+色综合图区一 | 在线99| 久久视频在线 | 日本精品久久久久久久 | 欧美日韩一区二区视频免费看 | 欧美在线一区二区三区精品 | 国产一区二区三区不卡观 | 亚洲免费人成在线视频观看 | 中文字幕欧美日韩va免费视频 | 久草在线免费看 | 99热久久国产精品 | 亚欧有色亚欧乱色视频 | 久热这里只有精 | 免费区欧美一级毛片 | 91亚洲精品久久91综合 | 狠狠色丁婷婷综合久久 | 久久综合婷婷 | 毛片免 | 99久久免费费视频在线观看 | 国内精品51视频在线观看 | 成人毛片免费观看视频在线 | 色综合久久久久久久 | 91国内在线国内在线播放 | 日韩中文在线 | 亚洲欧美专区精品久久 | 狠狠色丁香婷婷综合久久来 | 亚洲爱爱久久精品 | 亚洲精品久中文字幕 | 国产一级大片免费看 | 伊人免费视频 | 国产一区二区三区免费播放 | 99久久精品国产免费 | 久久国产麻豆 | 欧美一级毛片日本 | 国产成人综合洲欧美在线 | 99久久综合给久久精品 | 国产91在线 | 中文 | 九九热香蕉视频 |