Java 文件內(nèi)容

2018-02-05 15:34 更新

Java IO教程 - Java文件內(nèi)容

文件的內(nèi)容類(lèi)型

Files.probeContentType(Path path)方法探測(cè)文件的內(nèi)容類(lèi)型。

該方法以多用途Internet郵件擴(kuò)展(MIME)內(nèi)容類(lèi)型的值的字符串形式返回內(nèi)容類(lèi)型。

如果一個(gè)文件的內(nèi)容類(lèi)型不能確定,則返回null。

以下代碼顯示如何探測(cè)文件的內(nèi)容類(lèi)型。

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

public class Main {
  public static void main(String[] args) {
    Path p = Paths.get("C:\\Java_Dev\\test1.txt");

    try {
      String contentType = Files.probeContentType(p);
      System.out.format("Content type   of  %s  is %s%n", p, contentType);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上面的代碼生成以下結(jié)果。


讀取文件的內(nèi)容

Files類(lèi)包含以下方法來(lái)讀取文件的內(nèi)容作為字節(jié)和文本行:

  • static byte[] readAllBytes(Path path) - 讀取文件中的所有字節(jié)。
  • static List readAllLines(Path path) - 讀取文本文本行的整個(gè)內(nèi)容。
  • static List readAllLines(Path path, Charset cs)

Files類(lèi)可以從Path對(duì)象獲取InputStream和BufferedReader對(duì)象。

newInputStream(Path path,OpenOption ... options)方法返回指定路徑的InputStream對(duì)象。它假定文件的內(nèi)容是UTF-8字符集。

newBufferedReader(Path path)和newBufferedReader(Path path,Charset cs)方法返回一個(gè)BufferedReader。我們可以指定字符集。

Files類(lèi)提供了使用其newByteChannel(Path path,OpenOption ... options)方法從Path對(duì)象中獲取SeekableByteChannel對(duì)象的方法。

OpenOption類(lèi)型配置正在打開(kāi)的文件。下表列出了OpenOption類(lèi)型的值及其描述。OpenOption是java.nio.file包中的一個(gè)接口。

java.nio.file包中的StandardOpenOption枚舉實(shí)現(xiàn)了OpenOption接口。

標(biāo)準(zhǔn)打開(kāi)選項(xiàng)描述
APPEND將寫(xiě)入的數(shù)據(jù)附加到現(xiàn)有文件,如果文件被打開(kāi)寫(xiě)入。
CREATE創(chuàng)建一個(gè)新文件,如果它不存在。
CREATE_NEW創(chuàng)建一個(gè)新文件,如果它不存在。如果文件已存在,則操作失敗。
DELETE_ON_CLOSE關(guān)閉流時(shí)刪除文件。 在與臨時(shí)文件一起使用時(shí)非常有用。
DSYNC保持文件的內(nèi)容與底層存儲(chǔ)同步。
READ打開(kāi)具有讀訪問(wèn)權(quán)限的文件。
SPARSE如果它與CREATE_NEW選項(xiàng)一起使用,它對(duì)文件系統(tǒng)提示新文件應(yīng)該是稀疏文件。
SYNC保持文件的內(nèi)容和元數(shù)據(jù)與底層存儲(chǔ)同步。
TRUNCATE_EXISTING如果打開(kāi)文件以進(jìn)行寫(xiě)訪問(wèn),則將現(xiàn)有文件的長(zhǎng)度截?cái)酁榱恪?/td>
WRITE打開(kāi)文件以進(jìn)行寫(xiě)訪問(wèn)。

以下代碼在默認(rèn)目錄中為test2.txt文件獲取一個(gè)SeekableByteChannel對(duì)象。

它打開(kāi)文件以進(jìn)行讀取和寫(xiě)入訪問(wèn)。它使用CREATE選項(xiàng),因此如果文件不存在,則創(chuàng)建該文件。

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.READ;
import static java.nio.file.StandardOpenOption.WRITE;

import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path src = Paths.get("test2.txt");
    SeekableByteChannel sbc = Files.newByteChannel(src, READ, WRITE, CREATE);
  }
}

以下代碼演示了如何讀取和顯示我們默認(rèn)目錄中test1.txt文件的內(nèi)容。 如果文件不存在,程序?qū)@示一條錯(cuò)誤消息。

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class Main {
  public static void main(String[] args) throws Exception{
    Charset cs = Charset.forName("US-ASCII");
    Path source = Paths.get("test1.txt");

    List<String> lines = Files.readAllLines(source, cs);
    for (String line : lines) {
        System.out.println(line);
    }
  }
}

寫(xiě)入文件

我們可以使用Files類(lèi)的以下write()方法將內(nèi)容寫(xiě)入文件。

static Path  write(Path path, byte[]  bytes,  OpenOption... options)
static Path  write(Path path, Iterable lines, OpenOption... options)
static Path  write(Path path, Iterable lines, Charset cs, OpenOption... options)

write()方法打開(kāi)文件,將傳遞的內(nèi)容寫(xiě)入文件,并關(guān)閉它。

如果沒(méi)有打開(kāi)選項(xiàng),它將使用CREATE,TRUNCATE_EXISTING和WRITE選項(xiàng)打開(kāi)文件。

如果我們正在向文件寫(xiě)入文本,它會(huì)寫(xiě)一個(gè)平臺(tái)相關(guān)的行分隔符。

如果在寫(xiě)入文本行時(shí)未指定charset,則假定使用UTF-8字符集。

以下代碼演示如何使用write()方法將文本行寫(xiě)入文件。

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.WRITE;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<String> texts = new ArrayList<>();
    texts.add("test");
    texts.add("test");
    Path dest = Paths.get("twinkle.txt");
    Charset cs = Charset.forName("US-ASCII");
    try {
      Path p = Files.write(dest, texts, cs, WRITE, CREATE);
      System.out.println("Text was written to " + p.toAbsolutePath());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Files.newOutputStream(Path path,OpenOption ... options)返回指定路徑的OutputStream。

Files.newBufferedWriter(Path path,Charset cs,OpenOption ...選項(xiàng))方法為指定的路徑返回BufferedWriter。

上面的代碼生成以下結(jié)果。

隨機(jī)訪問(wèn)文件

SeekableByteChannel對(duì)象提供對(duì)文件的隨機(jī)訪問(wèn)。

我們可以使用Files類(lèi)的newByteChannel()方法為Path獲取一個(gè)SeekableByteChannel對(duì)象,如下所示:

Path  src = Paths.get("test.txt"); 
SeekableByteChannel seekableChannel  = Files.newByteChannel(src, READ,  WRITE,  CREATE,  TRUNCATE_EXISTING);

我們可以使用size()方法以字節(jié)為單位獲取SeekableByteChannel實(shí)體的大小。

由于數(shù)據(jù)被截?cái)嗷驅(qū)懭胪ǖ?,因此更新了大小?/p>

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.READ;
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
import static java.nio.file.StandardOpenOption.WRITE;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) {
    Path src = Paths.get("test.txt");
    String encoding = System.getProperty("file.encoding");
    Charset cs = Charset.forName(encoding);
    try (SeekableByteChannel seekableChannel = Files.newByteChannel(src, READ,
        WRITE, CREATE, TRUNCATE_EXISTING)) {
      printDetails(seekableChannel, "Before writing data");
      writeData(seekableChannel, cs);
      printDetails(seekableChannel, "After writing data");

      seekableChannel.position(0);
      printDetails(seekableChannel, "After resetting position to 0");
      readData(seekableChannel, cs);
      printDetails(seekableChannel, "After reading data");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void writeData(SeekableByteChannel seekableChannel, Charset cs)
      throws IOException {
    String separator = System.getProperty("line.separator");
    StringBuilder sb = new StringBuilder();
    sb.append("test");
    sb.append(separator);
    sb.append("test2");
    sb.append(separator);

    CharBuffer charBuffer = CharBuffer.wrap(sb);
    ByteBuffer byteBuffer = cs.encode(charBuffer);
    seekableChannel.write(byteBuffer);
  }

  public static void readData(SeekableByteChannel seekableChannel, Charset cs)
      throws IOException {
    ByteBuffer byteBuffer = ByteBuffer.allocate(128);
    String encoding = System.getProperty("file.encoding");
    while (seekableChannel.read(byteBuffer) > 0) {
      byteBuffer.rewind();
      CharBuffer charBuffer = cs.decode(byteBuffer);
      System.out.print(charBuffer);
      byteBuffer.flip();
    }
  }

  public static void printDetails(SeekableByteChannel seekableChannel,
      String msg) {
    try {
      System.out.println(msg + ": Size   = " + seekableChannel.size()
          + ", Position = " + seekableChannel.position());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)