精华内容
下载资源
问答
  • 不幸的是,Javadocs指出这是一个命名不明确的方法:它还可以返回一个字节偏移量(在实践中似乎是正确的).从文件读取时(例如),这似乎无济于事:Return the byte or character offset into the input source ...

    XMLStreamReader-> Location具有称为getCharacterOffset()的方法.

    不幸的是,Javadocs指出这是一个命名不明确的方法:它还可以返回一个字节偏移量(在实践中似乎是正确的).从文件读取时(例如),这似乎无济于事:

    Return the byte or character offset into the input source this

    location is pointing to. If the input source is a file or a byte

    stream then this is the byte offset into that stream, but if the input

    source is a character media then the offset is the character offset. (emphasis added)

    我真的需要字符偏移量;而且我很确定我会得到字节偏移量.

    (UTF-8编码)XML包含在(部分损坏的1G)文件中. [因此需要使用一个较低级别的API,除非它确实别无选择,否则不要抱怨它缺乏格式正确性].

    Javadoc说“ …输入源是字符介质…”时是什么意思:我如何强制其将输入文件视为“字符介质”,以便获得准确的(字符)偏移量而不是字节偏移量?

    等等等等:

    [我很确定这是怎么回事-当我将文件剥离(使用某些已知的高级标签)时,我丢失或丢失了几个字符-以一种不容忍的方式-我将区别最多可以删除几个多字节字符:同样,当我复制(例如在Powershell中使用“ head” /“ tail”)时,该工具似乎可以正确识别[或假定UTF-8]并可以很好地转换为据我所见,UTF-16

    展开全文
  • Enter The Sentence: heey Enter location: 5 String index out of range: 9 , import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io....

    I have to write a program that reads a file and inserts some text given by the user through the console window. The location in which the text is inserted should also be given through the console window.

    Below is my code, I am getting "String index out of range" after entering the sentence and offset.

    Enter The Sentence:

    heey

    Enter location:

    5

    String index out of range: 9

    import java.io.BufferedInputStream;

    import java.io.BufferedOutputStream;

    import java.io.BufferedWriter;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.FileWriter;

    import java.util.Scanner;

    import java.io.Writer;

    class ReadPosition{

    public static void main(String args[]) {

    try{

    FileWriter Writer =

    new FileWriter("in.txt");

    @SuppressWarnings("resource")

    BufferedWriter bufferedWriter =

    new BufferedWriter(Writer);

    Scanner input= new Scanner(System.in);

    System.out.println("Enter The Sentence: ");

    String sentence = input.nextLine();

    System.out.println("Enter location: ");

    int offset = input.nextInt();

    input.close();

    byte[] buffer = sentence.getBytes();

    int len = buffer.length;

    bufferedWriter.write(sentence, offset, len);

    }

    catch(Exception ex)

    {

    System.out.println(ex.getMessage());

    }

    }

    }

    解决方案

    The line

    bufferedWriter.write(sentence, offset, len);

    means write out len characters from sentence starting at offset in sentence.

    In other words offset is the position in the sentence not the position in the output file.

    If you want to insert text in a file you need to write code to copy the file to a new file adding the text at the correct position during the copy.

    Also you should not be using

    @SuppressWarnings("resource")

    to suppress the close missing warning - you do need to close your writer.

    展开全文
  • 1.我们知道使用Flume实时监控日志文件,可以使用tail -F 文件地址,但是使用tail -F 会有一个问题 当日志滚动添加至一个文件的时 突然Flume出现...那么有没有我们自己去管理文件的数据偏移量呢?避免出现服务重启带来...

    1.我们知道使用Flume实时监控日志文件,可以使用tail -F 文件地址,但是使用tail -F 会有一个问题 当日志滚动添加至一个文件的时 突然Flume出现异常导致Flume服务挂掉此时日志文件还在不停的滚动而Flume如果想要收集数据就得重启服务但是重启后的Flume会将目标文件重头开始数据收集,此时就会出现数据重复被收集!那么有没有我们自己去管理文件的数据偏移量呢?避免出现服务重启带来的数据重复收集呢?答案是可以的~

    2.此时我们可以自定义Source来管理我们的文件数据偏移量

    添加pom.xml

    org.apache.flume

    flume-ng-core

    1.6.0

    3.创建我们的自定义类

    ce2c6f5b22c2?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

    image.png

    package com.atguigu.gmall.flume.source;

    import com.google.gson.Gson;

    import org.apache.commons.io.FileUtils;

    import org.apache.commons.lang.StringUtils;

    import org.apache.flume.Context;

    import org.apache.flume.Event;

    import org.apache.flume.EventDrivenSource;

    import org.apache.flume.channel.ChannelProcessor;

    import org.apache.flume.conf.Configurable;

    import org.apache.flume.event.EventBuilder;

    import org.apache.flume.source.AbstractSource;

    import org.mortbay.util.ajax.JSON;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import java.io.File;

    import java.io.IOException;

    import java.io.RandomAccessFile;

    import java.nio.charset.Charset;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Executors;

    import java.util.concurrent.TimeUnit;

    public class MyFlumeSource extends AbstractSource implements EventDrivenSource, Configurable {

    private static final Logger logger = LoggerFactory.getLogger(MyFlumeSource.class);

    private String filePath;

    private String posiPath;

    private Long interval;

    private String charset;

    private FileRunner fileRunner;

    private ExecutorService executor;

    private ChannelProcessor channelProcessor;

    @Override

    public void configure(Context context) {

    this.filePath = context.getString("filePath");

    this.posiPath = context.getString("posiPath");

    this.interval = context.getLong("interval");

    this.charset = context.getString("charset");

    this.channelProcessor = channelProcessor;

    }

    @Override

    public synchronized void start() {

    logger.info("MyFlumeSource start now..................");

    this.executor = Executors.newSingleThreadExecutor();

    ChannelProcessor channelProcessor = getChannelProcessor();

    logger.info("filePath={},posiPath={},interval={},charset={},channelProcessor={}", filePath, posiPath, interval, charset, JSON.toString(channelProcessor));

    fileRunner = new FileRunner(filePath, posiPath, interval, charset, channelProcessor);

    executor.execute(fileRunner);

    super.start();

    }

    @Override

    public synchronized void stop() {

    fileRunner.setFlag(false);

    executor.shutdown();

    while (!this.executor.isTerminated()) {

    logger.debug("Waiting for exec executor service to stop");

    try {

    this.executor.awaitTermination(500L, TimeUnit.MILLISECONDS);

    } catch (InterruptedException var2) {

    logger.debug("Interrupted while waiting for exec executor service to stop. Just exiting.");

    Thread.currentThread().interrupt();

    }

    }

    super.stop();

    }

    private static class FileRunner implements Runnable {

    private String filePath;//读取数据的位置

    private String posiPath;//偏移量存储的地方

    private Long interval;//采集数据的间隔时间

    private String charset;//编码方式

    private Long offset = 0L;

    private RandomAccessFile raf;//读取日志文件

    private File pfile;//偏移量文件实例就是一个文件

    private ChannelProcessor channelProcessor;//

    private Boolean flag = true;

    private FileRunner(String filePath, String posiPath, long interval, String charset, ChannelProcessor channelProcessor) {

    this.filePath = filePath;

    this.posiPath = posiPath;

    this.interval = interval;

    this.charset = charset;

    this.channelProcessor = channelProcessor;

    pfile = new File(posiPath);

    if (!pfile.exists()) {

    try {

    pfile.createNewFile();

    } catch (IOException e) {

    logger.error("create position file Exception:{}", JSON.toString(e));

    }

    }

    try {

    String offsetStr = FileUtils.readFileToString(pfile);

    if (offsetStr != null && !"".equals(offsetStr)) {

    offset = Long.parseLong(offsetStr);

    }

    raf = new RandomAccessFile(filePath, "r");

    raf.seek(offset);

    } catch (IOException e) {

    logger.error("read position file Exception:{}", JSON.toString(e));

    }

    }

    @Override

    public void run() {

    while (flag) {

    try {

    String line = raf.readLine();

    if (StringUtils.isNotBlank(line)) {

    Event event = EventBuilder.withBody(line, Charset.forName(charset));

    channelProcessor.processEvent(event);

    //获取最新的偏移量

    offset = raf.getFilePointer();

    //偏移量写入到一个文件

    FileUtils.writeStringToFile(pfile, offset.toString());

    } else {

    Thread.sleep(interval);

    }

    } catch (Exception e) {

    logger.error("read line error...");

    }

    }

    }

    public void setFlag(boolean flag) {

    this.flag = flag;

    }

    }

    }

    4.我们将此类打包上传至$flume_home/lib

    5.我们开始编辑我们的文件,我取名为 test-source-offset.conf

    #定义agent名, source、channel、sink的名称

    a1.sources = r1

    a1.channels = c1

    a1.sinks = k1

    #具体定义source Type一定是全路径

    a1.sources.r1.type = com.atguigu.gmall.flume.source.MyFlumeSource

    #目标文件

    a1.sources.r1.filePath =/opt/module/test.log

    #偏移量保存位置

    a1.sources.r1.posiPath =/opt/module/posi.txt

    a1.sources.r1.interval = 1000

    a1.sources.r1.charset = UTF-8

    a1.sinks.k1.type = logger

    a1.channels.c1.type = memory

    a1.channels.c1.capacity = 1000

    a1.channels.c1.transactionCapacity = 100

    a1.sources.r1.channels = c1

    a1.sinks.k1.channel = c1

    6.测试

    6.1 创建一个/opt/module/test.log文件

    6.2启动Flume服务

    bin/flume-ng agent -n a1 -c conf -f /opt/module/test-source-offset.conf -Dflume.root.logger=INFO,console

    6.3 我们模拟往test.log添加数据 并观察

    echo chejiang >> test.log

    echo liyan >>test.log

    echo jiangjun >> test.log

    6.4观察Flume的数据收集状况

    ce2c6f5b22c2?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

    image.png

    6.5此时断掉服务flume服务在往test.log 文件写数据在启动Flume服务会发现写数据的状况

    ce2c6f5b22c2?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

    image.png

    6.6:消费数据的状况会发现不会重头消费

    ce2c6f5b22c2?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

    image.png

    展开全文
  • 不幸的是,Javadocs指出这是一个命名不明确的方法:它还可以返回一个字节偏移量(在实践中似乎是正确的).从文件读取时(例如),这似乎无济于事:Return the byte or character offset into the input source ...

    XMLStreamReader-> Location具有称为getCharacterOffset()的方法.

    不幸的是,Javadocs指出这是一个命名不明确的方法:它还可以返回一个字节偏移量(在实践中似乎是正确的).从文件读取时(例如),这似乎无济于事:

    Return the byte or character offset into the input source this

    location is pointing to. If the input source is a file or a byte

    stream then this is the byte offset into that stream, but if the input

    source is a character media then the offset is the character offset. (emphasis added)

    我真的需要字符偏移量;而且我很确定我会得到字节偏移量.

    (UTF-8编码)XML包含在(部分损坏的1G)文件中. [因此需要使用一个较低级别的API,除非它确实别无选择,否则不要抱怨它缺乏格式正确性].

    Javadoc说“ …输入源是字符介质…”时是什么意思:我如何强制其将输入文件视为“字符介质”,以便获得准确的(字符)偏移量而不是字节偏移量?

    等等等等:

    [我很确定这是怎么回事-当我将文件剥离(使用某些已知的高级标签)时,我丢失或丢失了几个字符-以一种不容忍的方式-我将区别最多可以删除几个多字节字符:同样,当我复制(例如在Powershell中使用“ head” /“ tail”)时,该工具似乎可以正确识别[或假定UTF-8]并可以很好地转换为据我所见,UTF-16

    解决方法:

    偏移量以基础Source为单位.

    XMLStreamReader仅知道已从Source读取了多少个单位,因此以这些单位计算偏移量.

    流以字节为单位工作,因此最终导致字节偏移.

    Reader以char为单位工作,因此最终以char偏移.

    StreamSource的文档在“字符媒体”一词的含义上更为明确.

    也许尝试像

    final Source source = new StreamSource(new InputStreamReader(new FileInputStream(new File("my.xml")), "UTF-8"));

    final XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(source);

    标签:stax,java

    来源: https://codeday.me/bug/20191031/1972433.html

    展开全文
  • I have the following Java code:public int sign(int a) {if(a<0) return -1;else if (a>0) return 1;else return 0;}which when compiled generated the following bytecode:public int sign(int);Code:0: i...
  • I'd like something like a generic, re-usable getPosition() method that will tell me the number of bytes read from the starting point of the stream. Ideally, I would prefer this to work with all Input....
  • Java中的文件读写

    2021-02-12 12:52:50
    文件读写相关的类(1) java.io.InputStream: 抽象类,输入字节流,可以将本输入流中的字节读取出来。主要方法: void read(byte[] b):从输入流中读取一定数量的字节,将其存储在缓冲区数组b中。(2) java.io.O...
  • 我有以下字符串:String timeStamp = "2020-01-...我尝试使用Java 8 DateTimeFormatter解析它。DateTimeFormatter formatter = DateTimeFormatter.ofPattern( format );tmpTimestamp = ZonedDateTime.parse( timeSta...
  • 看了第6章的java class文件这一部分,我觉得对class文件有进一步的了解。于是想作一点笔记,以备以后查时方便。这章的一个例子虽然简单,但是我觉的很有一定代表性。例子如下:1:class Act {2: public static void...
  • java中主要有4个输入输出的抽象类,InputSteam、OutputStream、Reader和Writer。其中InputStream和OutputStream为字节流设计;Reader和Writer为字符流设计。FileInputStream继承自InputStream,FileOutputStream继承...
  • java读取文本文件内容并获取文件大小:importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileReader;importjava.io.IOException;publicclassFileContent{...
  • 你大概想象的是有这么一个文件流对象,在使用它的时候可以给它设置一个起始位置和结束位置,然后开始一行一行出来,用几行代码就能搞定。我在网上查了好多资料,都没有找到期望的对象,于是我就先断定java中是不...
  • Java文件描述符

    2021-02-13 00:44:56
    文件描述符在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数。内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件文件...
  • 本人刚参加工作,面试的时候遇四道笔试题,其中就有这道多线程有序读取文件的题目,初看时拿不准,感觉会,又感觉不会。于是放弃了这道题,今天闲下来好好做一遍。//定义一个runnable接口的实现类import java.io....
  • java文件中追加内容与读写文件内容源码实例代码向文件尾加入内容有多种方法,常见的方法有两种:RandomAccessFile类可以实现随机访问文件的功能,可以以读写方式打开文件夹的输出流public void seek(long pos)可以...
  • Java流与文件

    2021-03-05 19:10:27
    Java中I/O操作主要是指使用Java进行输入,输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的...
  • 使用Java下载大文件

    千次阅读 2021-02-12 09:57:22
    title: 使用Java下载大文件date: 2017-09-04 04:51:12tags: [Java]主要思路是将大文件分解成若干个小文件进行下载.本功能由两个类实现:DownLoadManager和DownloadThreadTask实现. 其中DownLoadManager类主要负责下载...
  • 文件任意位置读取一般有两种方法:1、使用FileInputStream类,skip指定位置2、使用RandomAccessFile类,seek指定位置...//从该字节开始,自己测注意中文是两个字节try{File file = new File("d:\\文件上传\\ss....
  • java的io流一直都是我比较头疼的部分(我没有系统学过java,一般需要实现什么功能再去看文档)。最近遇到一个需求:一个字节一个字节地读取一个文件。网上很多方法,代码一大堆。我在这里和大家分享一个简单的办法...
  • java上传文件夹文件

    2021-02-26 16:08:22
    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,...
  • Java文件定位读取

    2021-03-03 11:57:25
    1. 使用RandomAccessFile对象的seek函数来实现public void seek(long pos) throws IOExceptionRandomAccessFile randomAccessFile = newRandomAccessFile... // Set the file position 离文件起始位置10字节处random...
  • (1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集) (2)刷的算法题(还有左神的算法笔记) (3)面经+真题解析+对应的相关笔记(很全面) (4)视频学习(部分) ps:当你觉得学不进或者累了...
  • 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,...
  • [ JDK1.6官方下载_JDK6官方下载地址:...NIO中从Channel中数据非常简单:创建一个buffer;通过...
  • 核心原理:该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。*如何分片;*如何合成一个文件;*中断了从哪个分片开始。如何分,利用...
  •  //从文件读到buffer,最多装满buffer if (numRead > 0) { complete.update(buffer, 0, numRead); //用到的字节进行MD5的计算,第二个参数是偏移量 } } while (numRead != -1); fis.close(); return ...
  • 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,...
  • Kafka java端获取Topoic,新建Topic,offset(当前偏移量,最终偏移量)信息 网上很多介绍怎么获取偏移量的,但是都是互抄,而且版本过老,方法不适用,或者要创建Consumer才能获取偏移量,我就奇了怪了,监听自动...
  • import java.math.BigDecimal;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import org.codehaus.jettison.json.JSONObject;import sun.misc.BASE...
  • /*** 判断文件是否为图片* *@parampInput 文件名*@parampImgeFlag 判断具体文件类型*@return检查后的结果*@throwsException*/public static booleanisPicture(String pInput,String pImgeFlag)throwsException{//...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,209
精华内容 32,883
关键字:

java读文件偏移

java 订阅