java存储数据到本地txt文件中-以及-读取txt文件的内容

java存储数据,方便打印日志等

1、会覆盖以前的数据

try {

    File writeName = new File("D:\data.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
    if(!writeName.exists()) {
        writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
    }
    FileWriter writer = new FileWriter(writeName);
    BufferedWriter out = new BufferedWriter(writer);
    out.write(data);
    out.flush(); // 把缓存区内容压入文件
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}

2、接下一行存储,数据不覆盖 

try {
        File file = new File("D:\data.txt");
        if(!file.exists()) {
            file.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
        }
        FileOutputStream fos = new FileOutputStream(file,true);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(data);
        bw.newLine();
        bw.flush();
        bw.close();
        osw.close();
        fos.close();
}catch (FileNotFoundException e1) {
    e1.printStackTrace();
} catch (IOException e2) {
    e2.printStackTrace();
}

从txt文件中读取数据:

JDK8,你可以这样,按行读取:

Path path = Paths.get("D:/aa.txt");
List<String>  lines = Files.readLines(path);

JDK8,你可以这样,读取全部:

Path path = Paths.get("D:/aa.txt");
byte[] data = Files.readAllBytes(path);
String result = new String(data, "utf-8");

对于JDK11及以上版本,读取文本文件异常简单,我们只需要这样:

Path path = Paths.get("D:/aa.txt");
String data = Files.readString(path);
System.out.println(data);

1.读取文件的乱码问题:

使用类库:Cpdetector。

请直接添加相关jar包或者使用maven导入。

CodepageDetectorProxy codepageDetectorProxy = CodepageDetectorProxy.getInstance();
codepageDetectorProxy.add(JChardetFacade.getInstance());
Charset charset = codepageDetectorProxy.detectCodepage(file.toURI().toURL());

最原始的方法:

java提供了一个FileInputStream,我们可以直接以文件路径构造这个流,也可以以文件对象构造他,如:FileInputStream fin = new FileInputStream("d:/aa.txt");

然后使用这个流就可以直接读取到文件了,但是这个时候读取到的内容是int类型的数值,所以需要进一步的处理,我们把fin外面包上一个InputStreamReader,就变成了这样:

InputStreamReader reader = new InputStreamReader(fin);

但是这一个reader读取文本并不是很方便,有一点要注意,在这一个reader的构造方法上面可以设定字符编码;接下来,使用这个reader构造BufferedReader,BufferedReader拥有一个名为readLine的方法,可以读取一整行的文本,作为字符串返回,因此用起来会比较方便。

BufferedReader buffReader = new BufferedReader(reader);

接下来就是借助循环来读取文件中的字符串了,然后,去做你想做的事情好了

import java.io*;
public class MainStart{
    public static void main(String args[]){
        String filePath = "D:/aa.txt";
        FileInputStream fin = new FileInputStream(filePath);
        InputStreamReader reader = new InputStreamReader(fin);
        BufferedReader buffReader = new BufferedReader(reader);
        String strTmp = "";
        while((strTmp = buffReader.readLine())!=null){
            System.out.println(strTmp);
        }
        buffReader.close();
    }
}

二进制读取方式:

2.1 使用DataInputStream:

DataInputStream din = new DataInputStream(new FileInputStream(file));
byte[] data = new byte[1024];
while(din.read(data) > 0) {
    // 处理数据
}
din.close();

2.2 使用RandomAccessFile

RandomAccessFile randomFile = new RandomAccessFile(file, "r");
byte[] data = new byte[1024];
while(randomFile.read(data) > 0) {
    // 处理数据
}
randomFile.close();

2.3两者的区别

RandomAccessFile可以通过移动文件指针改变读取的位置,可以按照几种基本类型直接读取数据,可以跳过一定的字节,整体来看,文件就像一个大的二进制数组。而DataInputStream就是单纯的输入流。

3. 大量数据的处理思路:

3.1 借助ByteBuffer使用堆外内存,在不导致oom的情况且内存充足的情况下可以大量申请内存。

3.2 借助RandomAccessFile分块读取,记录读取的最后位置,处理完毕后继续读。或者多线程处理,拆分整个文件为多个大小相等的块,分入多个子线程进入线程池并发处理。

3.3 用BufferedReader和正则,匹配到特征数据后暂停,然后处理数据,然后继续读取。

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,您需要在项目引入Hbase的Java客户端库,并使用它连接到Hbase服务器。然后,您可以使用Hbase的Java API来读取Hbase表数据。 具体来说,您可以使用HTable类的get方法来获取指定行的数据。这个方法接受一个Get对象,其包含了行键和列族信息。 例如,下面的代码展示了如何获取Hbase表指定行的所有列族数据: ``` HTable table = new HTable(config, "tableName"); Get get = new Get("rowKey".getBytes()); Result result = table.get(get); byte[] value = result.getValue("columnFamily".getBytes(), "column".getBytes()); ``` 接下来,您可以使用Java的IO流将Hbase表读取到的数据写入到本地文件。 例如,下面的代码展示了如何使用BufferedWriter类将Hbase表读取到的数据写入到本地文件: ``` BufferedWriter writer = new BufferedWriter(new FileWriter("fileName")); writer.write(new String(value)); writer.close(); ``` 请注意,这里的代码仅是一个简单的示例,在实际应用,您可能需要编写更复杂的代码来处理Hbase表数据并将其写入到本地文件。 ### 回答2: Java可以通过HBase提供的Java API来读取HBase的表数据。主要的步骤包括连接HBase集群、获取表对象、创建Scan对象以及遍历读取数据。然后可以利用Java的IO流将数据写入到本地文件。 首先,需要引入HBase的相关依赖库,比如hbase-client、hbase-common等。 接下来,需要建立与HBase集群的连接。可以通过创建HBaseConfiguration对象,设置相关配置,如HBase的Zookeeper地址等。然后通过HBaseAdmin类的实例化对象来检查表是否存在、创建表等操作。 接下来,使用HBase的Java API打开表并获取表对象。可以通过HConnection的实例化对象来获取表的连接。然后使用getTable方法来获取表的实例。 通过创建Scan对象,可以指定需要读取的列族和列,并设置其它扫描参数,如过滤器等。然后使用表对象的getScanner方法获取ResultScanner,通过遍历ResultScanner对象,可以逐个获取表数据。 最后,使用Java的IO流将数据写入到本地文件。可以使用FileWriter或者BufferedWriter等类来创建文件并写入数据。 下面是一个简单的示例代码: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class HBaseReadAndWrite { public static void main(String[] args) throws IOException { // 设置HBase配置 Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "zookeeper地址"); // 建立与HBase集群的连接 HConnection connection = HConnectionManager.createConnection(conf); HBaseAdmin admin = new HBaseAdmin(connection); // 获取表对象 HTableInterface table = connection.getTable("表名"); // 创建Scan对象并设置需要读取的列族和列 Scan scan = new Scan(); scan.addColumn(Bytes.toBytes("列族名"), Bytes.toBytes("列名")); // 遍历读取数据并写入文件 ResultScanner scanner = table.getScanner(scan); BufferedWriter writer = new BufferedWriter(new FileWriter("本地文件路径")); for (Result result : scanner) { byte[] value = result.getValue(Bytes.toBytes("列族名"), Bytes.toBytes("列名")); writer.write(Bytes.toString(value)); writer.newLine(); } writer.close(); // 关闭连接 scanner.close(); table.close(); admin.close(); connection.close(); } } ``` 以上就是利用Java读取HBase表的数据存储,再利用IO流写入到本地文件的简单示例。在实际应用,还需要根据具体需求进行进一步的配置和优化。 ### 回答3: 使用Java读取Hbase表的数据然后存储到本地文件,需要使用HBase的Java API进行操作。 首先,需要创建一个HBase的连接对象和一个Table对象,用来访问HBase的表: ```java Configuration conf = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(conf); Table table = connection.getTable(TableName.valueOf("表名")); ``` 然后,可以使用Scan对象来定义需要读取数据范围,设置scan的扫描条件: ```java Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes("起始行键")); scan.setStopRow(Bytes.toBytes("结束行键")); scan.addColumn(Bytes.toBytes("列族名"), Bytes.toBytes("列名")); ``` 接下来,通过scan对象获取到一个ResultScanner对象,用来遍历HBase数据并获取每一行的结果: ```java ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { // 获取行键 byte[] rowKey = result.getRow(); // 获取某个列的值 byte[] value = result.getValue(Bytes.toBytes("列族名"), Bytes.toBytes("列名")); // 将数据写入本地文件 FileOutputStream outputStream = new FileOutputStream("文件路径", true); outputStream.write(rowKey); outputStream.write("\t".getBytes()); outputStream.write(value); outputStream.write("\n".getBytes()); outputStream.close(); } ``` 最后,记得在使用完之后关闭连接和释放资源: ```java scanner.close(); table.close(); connection.close(); ``` 以上就是使用Java读取HBase表的数据存储到本地文件的方法。通过逐行遍历HBase表的数据,并利用IO流写入到本地文件,可以便于后续对HBase数据进行分析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值