举报投诉联系我们 手机版 热门标签 VUE中文网
您的位置:VUE中文网 > java文件内容搜索 Java 文件内容

java文件内容搜索 Java 文件内容

2023-03-09 21:17 Java教程

java文件内容搜索 Java 文件内容

java文件内容搜索

Java文件内容搜索是一种常用的文件搜索方式,它可以帮助用户快速找到特定的文件内容。在Java中,有许多不同的工具可以用来搜索文件内容,这些工具可以根据用户的需要进行调整和优化。

首先,要使用Java文件内容搜索,首先需要准备一个文本文件。这个文本文件可能是一个单独的txt文件,也可能是一个zip压缩包中包含多个txt文件。然后,使用Java代码来读取这些txt文件中的内容。

File file = new File("file.txt");  // 创建一个File对象 
BufferedReader br = new BufferedReader(new FileReader(file)); // 创建BufferedReader对象 
String str = null;  // 定义字符串str 
while((str = br.readLine()) != null) { // 读取每行数据 
    System.out.println(str); // 打印出读取到的数据 
} 
br.close(); // 关闭BufferedReader对象 

然后,使用正则表达式来匹配特定的字符串或者字符序列。正则表达式是一种特殊的字符序列,它能够帮助我们快速地找到想要找到的字符序列。例如:如果想要找出所有“Hello World”字样的字符序列,就可以使用正则表达式“Hello World”来匹配相应的字符序列。

String patternStr = "Hello World";   // 正则表达式  
 Pattern pattern = Pattern.compile(patternStr);   // 生成Pattern对象  
 Matcher matcher = pattern.matcher(str);   // 生成Matcher对象  
 while (matcher.find()) {   // 执行匹配  
     System.out.println("Found value: " + matcher.group());   // 获得匹配值  
 } 

最后,将所有匹配上的字符序列保存在一个List集合中。List集合是Java中常用的集合之一,它能够保存多个不同元素并根据特定顺序进行遍历、修改、增加、减少、释放、遍历、保留和释放元素。因此,将所有匹配上的字符序列保存在List集合中是很方便也很快速的方法之一。

Java 文件内容

Java IO教程 - Java文件内容

文件的内容类型

Files.probeContentType(Path path)方法探测文件的内容类型。

该方法以多用途Internet邮件扩展(MIME)内容类型的值的字符串形式返回内容类型。

如果一个文件的内容类型不能确定,则返回null。

以下代码显示如何探测文件的内容类型。

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_Devtest1.txt");

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

上面的代码生成以下结果。


读取文件的内容

Files类包含以下方法来读取文件的内容作为字节和文本行:

  • static byte[] readAllBytes(Path path) - 读取文件中的所有字节。
  • static List readAllLines(Path path) - 读取文本文本行的整个内容。
  • static List readAllLines(Path path, Charset cs)

Files类可以从Path对象获取InputStream和BufferedReader对象。

newInputStream(Path path,OpenOption ... options)方法返回指定路径的InputStream对象。它假定文件的内容是UTF-8字符集。

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

Files类提供了使用其newByteChannel(Path path,OpenOption ... options)方法从Path对象中获取SeekableByteChannel对象的方法。

OpenOption类型配置正在打开的文件。下表列出了OpenOption类型的值及其描述。OpenOption是java.nio.file包中的一个接口。

java.nio.file包中的StandardOpenOption枚举实现了OpenOption接口。

标准打开选项描述
APPEND将写入的数据附加到现有文件,如果文件被打开写入。
CREATE创建一个新文件,如果它不存在。
CREATE_NEW创建一个新文件,如果它不存在。如果文件已存在,则操作失败。
DELETE_ON_CLOSE关闭流时删除文件。 在与临时文件一起使用时非常有用。
DSYNC保持文件的内容与底层存储同步。
READ打开具有读访问权限的文件。
SPARSE如果它与CREATE_NEW选项一起使用,它对文件系统提示新文件应该是稀疏文件。
SYNC保持文件的内容和元数据与底层存储同步。
TRUNCATE_EXISTING如果打开文件以进行写访问,则将现有文件的长度截断为零。
WRITE打开文件以进行写访问。

以下代码在默认目录中为test2.txt文件获取一个SeekableByteChannel对象。

它打开文件以进行读取和写入访问。它使用CREATE选项,因此如果文件不存在,则创建该文件。

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);
  }
}

以下代码演示了如何读取和显示我们默认目录中test1.txt文件的内容。 如果文件不存在,程序将显示一条错误消息。

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);
    }
  }
}

写入文件

我们可以使用Files类的以下write()方法将内容写入文件。

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()方法打开文件,将传递的内容写入文件,并关闭它。

如果没有打开选项,它将使用CREATE,TRUNCATE_EXISTING和WRITE选项打开文件。

如果我们正在向文件写入文本,它会写一个平台相关的行分隔符。

如果在写入文本行时未指定charset,则假定使用UTF-8字符集。

以下代码演示如何使用write()方法将文本行写入文件。

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 ...选项)方法为指定的路径返回BufferedWriter。

上面的代码生成以下结果。

随机访问文件

SeekableByteChannel对象提供对文件的随机访问。

我们可以使用Files类的newByteChannel()方法为Path获取一个SeekableByteChannel对象,如下所示:

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

我们可以使用size()方法以字节为单位获取SeekableByteChannel实体的大小。

由于数据被截断或写入通道,因此更新了大小。

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();
    }
  }
}

上面的代码生成以下结果。

阅读全文
以上是VUE中文网为你收集整理的java文件内容搜索 Java 文件内容全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 VUE中文网 vue88.com 版权所有 联系我们