⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bufferiorequest.java

📁 用java 编写的源码开放的文本编辑器。有很多有用的特性
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * BufferIORequest.java - I/O request * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2000, 2001 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */package org.gjt.sp.jedit.buffer;//{{{ Importsimport javax.swing.text.Segment;import java.io.*;import java.util.zip.*;import java.util.Vector;import org.gjt.sp.jedit.io.*;import org.gjt.sp.jedit.*;import org.gjt.sp.util.*;//}}}/** * A buffer I/O request. * @author Slava Pestov * @version $Id: BufferIORequest.java,v 1.5 2003/01/28 03:07:20 spestov Exp $ */public class BufferIORequest extends WorkRequest{	//{{{ Constants	/**	 * Size of I/O buffers.	 */	public static final int IOBUFSIZE = 32768;	/**	 * Number of lines per progress increment.	 */	public static final int PROGRESS_INTERVAL = 300;	public static final String LOAD_DATA = "BufferIORequest__loadData";	public static final String END_OFFSETS = "BufferIORequest__endOffsets";	public static final String NEW_PATH = "BufferIORequest__newPath";	/**	 * Buffer boolean property set when an error occurs.	 */	public static final String ERROR_OCCURRED = "BufferIORequest__error";	/**	 * A file load request.	 */	public static final int LOAD = 0;	/**	 * A file save request.	 */	public static final int SAVE = 1;	/**	 * An autosave request. Only supported for local files.	 */	public static final int AUTOSAVE = 2;	/**	 * An insert file request.	 */	public static final int INSERT = 3;	/**	 * Magic numbers used for auto-detecting Unicode and GZIP files.	 */	public static final int GZIP_MAGIC_1 = 0x1f;	public static final int GZIP_MAGIC_2 = 0x8b;	public static final int UNICODE_MAGIC_1 = 0xfe;	public static final int UNICODE_MAGIC_2 = 0xff;	//}}}	//{{{ BufferIORequest constructor	/**	 * Creates a new buffer I/O request.	 * @param type The request type	 * @param view The view	 * @param buffer The buffer	 * @param session The VFS session	 * @param vfs The VFS	 * @param path The path	 */	public BufferIORequest(int type, View view, Buffer buffer,		Object session, VFS vfs, String path)	{		this.type = type;		this.view = view;		this.buffer = buffer;		this.session = session;		this.vfs = vfs;		this.path = path;		markersPath = vfs.getParentOfPath(path)			+ '.' + vfs.getFileName(path)			+ ".marks";	} //}}}	//{{{ run() method	public void run()	{		switch(type)		{		case LOAD:			load();			break;		case SAVE:			save();			break;		case AUTOSAVE:			autosave();			break;		case INSERT:			insert();			break;		}	} //}}}	//{{{ toString() method	public String toString()	{		String typeString;		switch(type)		{		case LOAD:			typeString = "LOAD";			break;		case SAVE:			typeString = "SAVE";			break;		case AUTOSAVE:			typeString = "AUTOSAVE";			break;		default:			typeString = "UNKNOWN!!!";		}		return getClass().getName() + "[type=" + typeString			+ ",buffer=" + buffer + "]";	} //}}}	//{{{ Private members	//{{{ Instance variables	private int type;	private View view;	private Buffer buffer;	private Object session;	private VFS vfs;	private String path;	private String markersPath;	//}}}	//{{{ load() method	private void load()	{		InputStream in = null;		try		{			try			{				String[] args = { vfs.getFileName(path) };				setAbortable(true);				if(!buffer.isTemporary())				{					setStatus(jEdit.getProperty("vfs.status.load",args));					setProgressValue(0);				}				path = vfs._canonPath(session,path,view);				VFS.DirectoryEntry entry = vfs._getDirectoryEntry(					session,path,view);				long length;				if(entry != null)					length = entry.length;				else					length = 0L;				in = vfs._createInputStream(session,path,false,view);				if(in == null)					return;				in = new BufferedInputStream(in);				if(in.markSupported())				{					in.mark(2);					int b1 = in.read();					int b2 = in.read();					in.reset();					if(b1 == GZIP_MAGIC_1 && b2 == GZIP_MAGIC_2)					{						in = new GZIPInputStream(in);						buffer.setBooleanProperty(Buffer.GZIPPED,true);					}					else if((b1 == UNICODE_MAGIC_1 && b2 == UNICODE_MAGIC_2)						|| (b1 == UNICODE_MAGIC_2 && b2 == UNICODE_MAGIC_1))					{						buffer.setProperty(Buffer.ENCODING,"Unicode");					}				}				else if(path.toLowerCase().endsWith(".gz"))					in = new GZIPInputStream(in);				read(buffer,in,length);				buffer.setNewFile(false);			}			catch(CharConversionException ch)			{				Log.log(Log.ERROR,this,ch);				Object[] pp = { buffer.getProperty(Buffer.ENCODING),					ch.toString() };				VFSManager.error(view,path,"ioerror.encoding-error",pp);				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}			catch(UnsupportedEncodingException uu)			{				Log.log(Log.ERROR,this,uu);				Object[] pp = { buffer.getProperty(Buffer.ENCODING),					uu.toString() };				VFSManager.error(view,path,"ioerror.encoding-error",pp);				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}			catch(IOException io)			{				Log.log(Log.ERROR,this,io);				Object[] pp = { io.toString() };				VFSManager.error(view,path,"ioerror.read-error",pp);				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}			catch(OutOfMemoryError oom)			{				Log.log(Log.ERROR,this,oom);				VFSManager.error(view,path,"out-of-memory-error",null);				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}			if(jEdit.getBooleanProperty("persistentMarkers"))			{				try				{					String[] args = { vfs.getFileName(path) };					if(!buffer.isTemporary())						setStatus(jEdit.getProperty("vfs.status.load-markers",args));					setAbortable(true);					in = vfs._createInputStream(session,markersPath,true,view);					if(in != null)						readMarkers(buffer,in);				}				catch(IOException io)				{					// ignore				}			}		}		catch(WorkThread.Abort a)		{			if(in != null)			{				try				{					in.close();				}				catch(IOException io)				{				}			}			buffer.setBooleanProperty(ERROR_OCCURRED,true);		}		finally		{			try			{				vfs._endVFSSession(session,view);			}			catch(IOException io)			{				Log.log(Log.ERROR,this,io);				String[] pp = { io.toString() };				VFSManager.error(view,path,"ioerror.read-error",pp);				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}			catch(WorkThread.Abort a)			{				buffer.setBooleanProperty(ERROR_OCCURRED,true);			}		}	} //}}}	//{{{ read() method	private void read(Buffer buffer, InputStream _in, long length)		throws IOException	{		IntegerArray endOffsets = new IntegerArray();		// only true if the file size is known		boolean trackProgress = (!buffer.isTemporary() && length != 0);		if(trackProgress)		{			setProgressValue(0);			setProgressMaximum((int)length);		}		// if the file size is not known, start with a resonable		// default buffer size		if(length == 0)			length = IOBUFSIZE;		SegmentBuffer seg = new SegmentBuffer((int)length + 1);		InputStreamReader in = new InputStreamReader(_in,			buffer.getStringProperty(Buffer.ENCODING));		char[] buf = new char[IOBUFSIZE];		// Number of characters in 'buf' array.		// InputStream.read() doesn't always fill the		// array (eg, the file size is not a multiple of		// IOBUFSIZE, or it is a GZipped file, etc)		int len;		// True if a \n was read after a \r. Usually		// means this is a DOS/Windows file		boolean CRLF = false;		// A \r was read, hence a MacOS file		boolean CROnly = false;		// Was the previous read character a \r?		// If we read a \n and this is true, we assume		// we have a DOS/Windows file		boolean lastWasCR = false;		// Number of lines read. Every 100 lines, we update the		// progress bar		int lineCount = 0;		while((len = in.read(buf,0,buf.length)) != -1)		{			// Offset of previous line, relative to			// the start of the I/O buffer (NOT			// relative to the start of the document)			int lastLine = 0;			for(int i = 0; i < len; i++)			{				// Look for line endings.				switch(buf[i])				{				case '\r':					// If we read a \r and					// lastWasCR is also true,					// it is probably a Mac file					// (\r\r in stream)					if(lastWasCR)					{						CROnly = true;						CRLF = false;					}					// Otherwise set a flag,					// so that \n knows that last					// was a \r					else					{						lastWasCR = true;					}					// Insert a line					seg.append(buf,lastLine,i -						lastLine);					endOffsets.add(seg.count);					seg.append('\n');					if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0)						setProgressValue(seg.count);					// This is i+1 to take the					// trailing \n into account					lastLine = i + 1;					break;				case '\n':					// If lastWasCR is true,					// we just read a \r followed					// by a \n. We specify that					// this is a Windows file,					// but take no further					// action and just ignore					// the \r.					if(lastWasCR)					{						CROnly = false;						CRLF = true;						lastWasCR = false;						// Bump lastLine so						// that the next line						// doesn't erronously						// pick up the \r						lastLine = i + 1;					}					// Otherwise, we found a \n					// that follows some other					// character, hence we have					// a Unix file					else					{						CROnly = false;						CRLF = false;						seg.append(buf,lastLine,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -