精华内容
下载资源
问答
  • 使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。... 因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以ObjectInputSt


    使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头。

    因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException。一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法。

    被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。

    自己重写一个类继承ObjectOutputStream来成生对象输出流

     

    展开全文
  • FileStream以追加方式打开文件“abc.txt”,并进行写入操作;StreamWriter将从’a’—‘z’26个小写字母写入文件中;StreamReader依次读取文件中各行数据,并通过控制台显示,读完关闭流和文件。 文件路径:...

    用FileStream以追加的方式打开文件“abc.txt”,并进行写入操作;用StreamWriter将从’a’—‘z’26个小写字母写入文件中;用StreamReader依次读取文件中各行数据,并通过控制台显示,读完关闭流和文件。
    文件路径:e:\abc.txt
    在这里插入图片描述

    在这里插入图片描述

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using System.Text;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //以追加的方式打开文件,并进行写入操作
                FileStream filewriter = new FileStream(@"e:\abc.txt", FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(filewriter); //构造函数,sw与文件建立连接
                for (char mychar = 'a'; mychar <= 'z'; mychar++)
                {
                    sw.Write(mychar);//将从a—z26个小写字母写入文件中.
                }
                sw.Close();
                filewriter.Close();
    
                FileStream filest = new FileStream(@"e:\abc.txt", FileMode.Open, FileAccess.ReadWrite);
                StreamReader sr = new StreamReader(filest); //sr与文件建立连接
                string strLine = sr.ReadLine();
                while (strLine != null)
                {
                    Console.WriteLine(strLine);
                    strLine = sr.ReadLine();
                }
                sr.Close();
                filest.Close();
                Console.ReadLine();
            }
        }
    }
    
    
    展开全文
  • 目前在网上很多人FilterWriter来写文件, 但是FilterWriter 不能指定编码格式, 导致编码问题, 有些人换成BufferedWriter 来写文件, 可以指定构建时的编码,但是又不知道怎么追加到文件尾. 因此, 今天把本人工作...

    目前在网上很多人用 FilterWriter来写文件, 但是 FilterWriter 不能指定编码格式, 导致编码问题,

    有些人换成 BufferedWriter 来写文件, 可以指定构建时的编码,  但是又不知道怎么追加到文件尾.

    因此, 今天把本人工作中用到的代码整理后归纳二式方式, 供大家参考.

    同时以多线程同时读/写同一个文件, 边写,边读, 以下是完整代码:

    package com.test;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.ByteArrayInputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    /**
     * 指定编码格式,并且以追加的方式写入文件,并且线程同步读取文件
     * @author guishuanglin 2019-09-20
     *
     */
    public class ReadWriteFile {
    	private Log logger = LogFactory.getLog(this.getClass());
    	
    	//线程是否在运行
    	private static boolean isRuning = false;
    	
    	
    	public static void main(String[] args) {
    		ReadWriteFile ff = new ReadWriteFile();
    		ff.runThread();
    	}
    	
    	/**
    	 * 运行处理线程,如果已经运行,则不再重复运行.
    	 */
    	private void runThread() {
    		if(isRuning) return;
    		isRuning = true;
    		
    		try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		new Thread(new writeThread()).start();	// 写数据
    		new Thread(new readThread()).start();	// 读线程
    	}
    	
    	/**
    	 * 读取文件线程
    	 */
    	private class readThread implements Runnable{
    		@Override
    		public void run() {
    			String msg = null;
    			FileInputStream in = null;
    			BufferedReader bufReader = null;
    			try {
    				String pathFileName = "D:/test/test.txt";
    				//File inf = new File(pathFileName);
    				in = new FileInputStream(pathFileName);
    				
    				//以指定的编码读取文件
    				bufReader = new BufferedReader(new InputStreamReader(in, "GBK"));
    				
    				for(int i=0; i< 30; i++){
    					//此方法达到文件尾时, 返回 null
    					msg = bufReader.readLine();
    					if(msg != null) {
    						logger.info("读取文件 ->: "+ msg );
    					}else {
    						logger.info("读取空行: ============" );
    					}
    					
    					//测试时用,正常代码去掉
    					Thread.sleep(1000);
    				}
    				
    			}catch (Exception e) {
    				logger.error("读取文件线程异常", e);
    			} finally {
    				try {
    					if (in != null) {
    						in.close();
    					}
    					in = null;
    					if (bufReader != null) {
    						bufReader.close();
    					}
    					bufReader = null;
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				
    			}
    		}
    	}
    	
    	/**
    	 * 方式1: 追加文件, 指定编码格式
    	 */
    	private class writeThread implements Runnable{
    		@Override
    		public void run() {
    			String msg = null;
    			FileOutputStream out = null;
    			BufferedWriter bufWriter = null;
    			try {
    				String pathFileName = "D:/test/test.txt";
    				//指定以追加方式写文件, 不要用 FilterWriter追加文件,因为FilterWriter不能指定编码格式
    				out = new FileOutputStream(pathFileName, true);
    				//指定写入内容编码格式, 只有用OutputStreamWriter才能指定编码格式, 这个是FilterWriter没有的.
    				bufWriter = new BufferedWriter(new OutputStreamWriter(out, "GBK"));
    				
    				msg =" 测试写文件,方式1..........................";
    				StringBuffer bf = new StringBuffer();
    				String msg2 = null;
    				
    				for(int i=0; i< 20; i++){
    					msg2 = i +", " + msg;
    					bf.append(msg2 + "\r\n");
    					
    					bufWriter.write(bf.toString());
    					bufWriter.flush();
    					
    					logger.info("写入文件: " + msg2);
    					bf = new StringBuffer(128);
    					
    					//测试时用,正常代码去掉
    					Thread.sleep(1000);
    				}
    				
    			}catch (Exception e) {
    				logger.error("写入文件线程异常", e);
    			} finally {
    				try {
    					if (bufWriter != null) {
    						bufWriter.close();
    					}
    					bufWriter = null;
    					
    					if (out != null) {
    						out.close();
    					}
    					out = null;
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	
    	/**
    	 * 
    	 * 方式2: 追加文件, 指定编码格式
    	 * 此方法比较原始, 都是用byte写入, 并且缓冲也可以自己控制,
    	 * 此方式本人用了上10年, 性能可靠, 可对编码格式随意控制, 并且针对jdk各种新方式测试, 比原生jdk1.6缓存写入方式性能要高.
    	 */
    	private class writeThread2 implements Runnable{
    		@Override
    		public void run() {
    			String msg = null;
    			FileOutputStream out = null;
    			try {
    				String pathFileName = "D:/test/test.txt";
    				//以追加的方式写入文件, 如果覆盖文件则这样写: out = new FileOutputStream(pathFileName), 这样就每次都会重写文件
    				out = new FileOutputStream(pathFileName, true);
    				
    				//写入内容,这个仅为测试方便,所以固定了,实际上应当从外部传入List<String> 或者传入StringBuffer
    				msg =" 测试写文件,方式2..........................";
    				StringBuffer bf = new StringBuffer();
    				String msg2 = null;
    				
    				byte[] bytes = new byte[20480];//20k,根据硬盘缓存大小调节,这个对性能很重要,可以根据服务器硬盘缓冲大小定制,以达到最佳写入速度.一般为硬盘缓存的1/4
    				byte[] inbytes = null;
    				for(int i=0; i< 20; i++){
    					msg2 = i +", " + msg;
    					bf.append(msg2+"\r\n");
    					//对于达到最佳写速度, 这个判断很重要, 缓存适当, 尽量减少对硬盘的写入(此为测试,因此不考虑性能)
    					if(bf.length() > 0) {
    						//不管原内容是什么格式, 拿到之后传成指定格式的byte
    						inbytes = bf.toString().getBytes("GBK");
    						//临时用字节输入流
    						ByteArrayInputStream in = new ByteArrayInputStream(inbytes);
    						int c;
    						while ((c = in.read(bytes)) != -1) {
    							out.write(bytes, 0, c);
    						}
    						in.close();
    						in = null;
    						logger.info("写入文件: " + msg2);
    						bf = new StringBuffer(128);
    					}
    					//测试时用,正常代码去掉
    					Thread.sleep(1000);
    				}
    				//结束时清空变量,养成习惯.
    				bytes =null;
    				inbytes =null;
    				bf = null;
    				msg = null;
    			}catch (Exception e) {
    				logger.error("写入文件线程异常", e);
    			} finally {
    				try {
    					if (out != null) {
    						out.close();
    					}
    					out = null;
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    

    发布之前, 以上代码经过简单的测试.

    展开全文
  • * 追加收录一转码方式 **/ var checker = new Unicode.Utf8Checker(); var isUtf8 = checker.Check(path); System.IO.StreamReader reader; if (isUtf8) reader = new System.IO.StreamReader(path); else re
    /**
     * 追加收录一转码方式 
     **/
    var checker = new Unicode.Utf8Checker();
    var isUtf8 = checker.Check(path);
    
    System.IO.StreamReader reader;
    if (isUtf8)
        reader = new System.IO.StreamReader(path);
    else
        reader = new System.IO.StreamReader(path, System.Text.Encoding.GetEncoding("GB2312"));
    
    
    /**
     * 用以获取请求页面源代码
     **/
    private String getPageSource(String url) 
    {
    	String Source = "";
    	try
    	{
    		//连接到网址
    		WebClient web = new WebClient();
    		Byte[] data = web.DownloadData(url);
    		//获取响应报文头
    		String sContentEncoding = web.ResponseHeaders["Content-Encoding"];
    		//处理报文编码为gzip的情况
    		if (sContentEncoding == "gzip")
    		{
    			MemoryStream ms = new MemoryStream(data);
    			MemoryStream msTemp = new MemoryStream();
    			int count = 0;
    			GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress);
    			byte[] buf = new byte[10000];
    			while ((count = gzip.Read(buf, 0, buf.Length)) > 0)
    			{
    				msTemp.Write(buf, 0, count);
    			}
    			data = msTemp.ToArray();
    		}
    		//获取网页编码格式
    		String Content_Type = web.ResponseHeaders.Get("Content-Type");
    		//获取流对象
    		//StreamReader reader = null;
    		Regex typeReg = new Regex("charset=.+", RegexOptions.IgnoreCase);
    		if (typeReg.IsMatch(Content_Type))
    		{
    			String CodeType = Content_Type.Substring(Content_Type.IndexOf("=") + 1).ToUpper();
    			//reader = new StreamReader(new MemoryStream(data), Encoding.GetEncoding(CodeType));
    			//Source = reader.ReadToEnd();
    			Source = Encoding.GetEncoding(CodeType).GetString(data);
    		}
    		else
    		{
    			//reader = new StreamReader(new MemoryStream(data), Encoding.UTF8);
    			//Source = reader.ReadToEnd();
    			Source = Encoding.GetEncoding("UTF-8").GetString(data);
    			if (isGarbled(Source))
    			{
    				//reader = new StreamReader(new MemoryStream(data), Encoding.UTF8);
    				//Source = reader.ReadToEnd();
    				Source = Encoding.GetEncoding("GBK").GetString(data);
    			}
    		}
    		Regex reg = new Regex(@"<(script|style)\s*.*?>\s*.*?\s*</(script|style)>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    		Source = reg.Replace(Source, "");
    		//关闭
    		//reader.Close();
    	}
    	catch (WebException e)
    	{
    		throw e;
    	}
    	return Source.Replace("\"", "'");
    }
    
    /**
     * 获取所有新闻标题
     **/
    private List<String> getNewsTitle(String url)
    {
    	List<String> strList = new List<String>();
    	try
    	{
    		//<a\s*?(?=[^>]*?targer=){1}.*?href='[^']*?\.(html|shtml)'\s*?>.*?</a>
    		//得到主页面
    		string mainPage = getPageSource(url);
    		//获取主页面所有新闻标题(可能一条匹配多条)
    		//Regex mainReg = new Regex(@"<(li|h[1-9]?|p)\s*[^i]*?>\s*?(\[?<a\s*?(target='.*?')?\s*?href='http://.*?'\s*?
    		//        (target='.*?')?\s*?>.*?</a>\]?)*?\s*?</\s*(li|h[1-9]?|p)\s*>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    		//获取一级匹配结果所有新闻标题(单一匹配)
    		//<a\s*?(target='_blank')?\s*?href='[^']*?news\.[^']*?\.(html|shtml)'\s*?(target='_blank')?[^>]*?>[^<]{3,}?</a>
    		Regex titleReg = new Regex(@"<li>\s*?<a\s*?(target='?_blank'?)?\s*?href='[^']*?news\.[^']*?\.(htm|html|shtml)'\s*?" + 
    			@"(target='?_blank'?)?[^>]*?>[^&<]{5,}?</a>\s*?</li>", RegexOptions.IgnoreCase);
    		//迭代获取新闻标题存于集合中
    		MatchCollection titleMc = titleReg.Matches(mainPage);
    		foreach (Match t in titleMc)
    		{
    			if (!strList.Contains(t.Value))
    			{
    				strList.Add(t.Value);
    			}
    		}
    	}
    	catch (WebException e)
    	{
    		throw e;
    	}
    	return strList;
    }
    
    /**
     * 判断是否存在乱码(无详细解释,参考网络)
     **/
    private Boolean isGarbled(String val)
    {
    	var bytes = Encoding.UTF8.GetBytes(val);
    	//连续三个byte表示为239 191 189则为乱码
    	for (var i = 0; i < bytes.Length; i++)
    	{
    		if (i < bytes.Length - 3)
    		{
    			if (bytes[i] == 239 && bytes[i + 1] == 191 && bytes[i + 2] == 189)
    			{
    				return true;
    			}
    		}
    	}
    	return false;
    }


    展开全文
  • 关于open的操作: ...a 以追加的模式打开(在原文件的末尾追加要写入的数据,不覆盖原文件) b 以二进制文件的方式打开 r+ w+ a+ 都是以读写的方式打开 rb 以二进制读的方式打开 wb 以二进制写的方式打开...
  • Linux秘钥对方式登录

    千次阅读 2018-04-28 14:55:34
    命令 ssh-keygen -t rsa第二步:把公钥上传到另一台服务器,想哪个账号登录就上传到哪个目录下命令 scp id_rsa.pub root@47.xxx.xx.xx:/root第三步:登录另一台服务器,再将公钥文件追加到 .ssh/authorized_keys...
  • 若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么ObjectInputStream读取这些object时会产生S treamCorruptedException? 答:使用缺省的serializetion的实现时,一个ObjectOutputStream的...
  • go语言中向文件尾部追加内容

    千次阅读 2019-05-18 19:35:59
    本来是一个很简单的问题,但最近两年多一直python写代码,习惯了那种简单的文件操作方式。在go里面打开文件时要指定文件读写模式,例如O_CREATE、O_RDONLY等等,和C非常相似,以前的时候还记得很清楚。今天遇到...
  • 文件打开方式当我们open()函数去打开文件的时候,有好几种打开的模式。"r"->只读"w"->只写,文件已存在则清空,不存在则创建。"a"->追加,写到文件末尾"b"->二进制模式,...
  • redis持久化方式

    2020-07-08 22:41:40
    AOF持久化,是以追加方式日志的形式来存储每一个写、删除操作,读操作不写入磁盘文件。 区别: RDB持久化只包含一个文件,文件小,启动快,但是不保证高可用,当子进程进行写文件时,如果数据量大,可能会造成...
  • Redis持久化方式之RDB

    千次阅读 多人点赞 2020-07-13 21:20:02
    redis持久化机制主要是将内存中的数据持久化到磁盘文件中,一种是RDB(快照)文件方式,另一种是AOF(追加)文件。 小编基于centos7环境搭建Redis,如果未安装redis环境,请参考小编另一篇文章:轻松在阿里云上搭建...
  • Redis -持久化方式对比

    2020-06-29 10:19:31
    redis 提供两种持久化方式,一种是RDB持久化(定时将数据被分到磁盘上),另一种是AOF(append only file)持久化(将对 redis 的操作日志以追加形式写入文件) RDB持久化 RDB持久化是指在指定的时间间隔内将内存...
  • 最常见的请求莫过于get和post...数据发送使用GET的方式发送请求时,数据被追加到open()方法中URL的末尾 数据问号开始,名和值之间等号链接起来,名值对之间&amp;分割,使用GET方式发送的数据常常被称之为...
  • // a+ 以追加以及创建文件的方式打开或创建文件 $fp = fopen("./api_ts.log", "a+"); //true使得变量返回, $a = var_export($_REQUEST,true); //echo输出写入到文件中去 (追加) fwrite($fp, $a); ...
  • // a+ 以追加以及创建文件的方式打开或创建文件 $fp = fopen("./1.log", "a+"); //true使得变量返回, $a = var_export($_GET,true); //echo输出写入到文件中去 (追加) echo fwrite($fp, $a); fclose($fp);
  • 例如,pythonlogging写入日志文件默认的读写方式是“a”(在文件尾追加日志记录);将生成的字符串列表加入到文件中,一般会用到“a+”;打开文件进行读取显示会用到open(‘filename’,‘r’)...... r ...
  • ab+表示二进制方式打开,数据写入时在原内容后追加;打开后指针在文件头部(所以 ftell() 获取的当前文件中已写入的数据长度为0); 但是fwrite的时候会判断打开模式,如果是ab+则移动到文件尾再写入 ftell() ...
  • Linux常见符号和命令 ...表示将符号左侧的内容,以追加方式输入到右侧文件的末尾 管道符 命令格式 命令1 | 命令2 命令1执行后的结果,传递给命令2使用 其他符号 后台展示符 &...
  • 1.字符串的定义形式有两种 1).使用字符数组来存储: 将字符串数据的每1个字符存储到字符数组的元素中,追加1个’\0’表示结束....不管是上述那种方法,在字符串的最后都有\0代表字符串结束。计算
  • 1. 打包归档命令tar: 1.1 六个独立命令 -c 创建一个新的归档文件 ...1.2 压缩或解压缩要的命令 -j bzip2的形式将打包的文件压缩 -z gzip形式将打包的文件压缩 –delete 删除etc.tar下的etc/hosts -v 查看...
  • * 5、两个数都是字符串的方式提供。 * 思路: * 字符串逐位相加,需要进位则进位处理,考虑两个问题: * 1、char怎么转换为integer, 减去'0'即可 * 2、怎么处理对应位相加?反转字符串相加,正确处理进位...
  • redis使用集群的好处和为啥安装ruby redis是一个key-value存储...并且在此基础上实现了master-slave(主从)同步,此时redis就需要集群方式部署,redis集群模式下,所有master参与,如果半数以上master节点与master节...
  • 在iOS中最简单的UICollectionView就是GirdView(网格视图),可以多列的方式将数据进行展示。标准的UICollectionView包含以下3个部分,他们都是UIView的子类: Cell:用于展示内容的主体,可以定制其尺寸和内容。 ...
  • 上代码: 发送端: 接收端: 问题:发送端可以接受从前段传过来的数据,但是请求...但是post请求的数据会放在请求体,所 ,如果不加注解,微服务之间的传输在接收端默认是追加方式,所以接收不到参数。...
  • 本文将结合面向对象设计原则实践来介绍如何将一个Java对象树输出到XML文件模块。...2. 考虑到内存压力,要求该模块实现以追加方式操作XML文件。 输入 Java对象树(提供一个类以方法,作为该对象的操作入口) ...
  • 支持持久化操作,可以进行aof(将Reids的操作日志以追加方式写入文件)及rdb(Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失...
  • redis——redis持久化处理

    千次阅读 2018-05-08 11:43:25
    Redis持久性Redis主要分为三种持久性...使用与Redis协议本身相同的格式以追加方式记录命令。Redis可以在日志变得太大时在后台重写日志。3、AOF+RDB:混合式瞎鸡儿乱。RDB的优点RDB是Redis数据的非常紧凑的单文件时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 441
精华内容 176
关键字:

以追加方式用