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

📄 lftocrlfinputstream.java

📁 SFTP Plug-in for Eclipse will add the SFTP support to Eclipse
💻 JAVA
字号:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *  * Contributors: *     IBM Corporation - initial API and implementation *     Atsuhiko Yamanaka, JCraft, Inc. - adding sftp support. *******************************************************************************/package com.jcraft.eclipse.sftp.internal.streams;import java.io.FilterInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InterruptedIOException;/** * Converts LFs in the underlying input stream to CR/LF. *  * Supports resuming partially completed operations after an InterruptedIOException * if the underlying stream does.  Check the bytesTransferred field to determine how * much of the operation completed; conversely, at what point to resume. */public class LFtoCRLFInputStream extends FilterInputStream{  private boolean mustReturnLF=false;  /**   * Creates a new filtered input stream.   * @param in the underlying input stream   */  public LFtoCRLFInputStream(InputStream in){    super(in);  }  /**   * Wraps the underlying stream's method.   * Translates LFs to CR/LF sequences transparently.   * @throws InterruptedIOException if the operation was interrupted before all of the   *         bytes specified have been skipped, bytesTransferred will be zero   * @throws IOException if an i/o error occurs   */  public int read() throws IOException{    if(mustReturnLF){      mustReturnLF=false;      return '\n';    }    int b=in.read(); // ok if this throws    if(b=='\n'){      mustReturnLF=true;      b='\r';    }    return b;  }  /**   * Wraps the underlying stream's method.   * Translates LFs to CR/LF sequences transparently.   * @throws InterruptedIOException if the operation was interrupted before all of the   *         bytes specified have been skipped, bytesTransferred may be non-zero   * @throws IOException if an i/o error occurs   */  public int read(byte[] buffer, int off, int len) throws IOException{    // handle boundary cases cleanly    if(len==0){      return 0;    }    else if(len==1){      int b=read();      if(b==-1)        return -1;      buffer[off]=(byte)b;      return 1;    }    // prefix with remembered \n from last read, but don't expand it a second time    int count=0;    if(mustReturnLF){      mustReturnLF=false;      buffer[off++]='\n';      --len;      count=1;      if(len<2)        return count; // is there still enough room to expand more?    }    // read some bytes from the stream into the back half of the buffer    // this guarantees that there is always room to expand    len/=2;    int j=off+len;    InterruptedIOException iioe=null;    try{      len=in.read(buffer, j, len);      if(len==-1){        return (count==0) ? -1 : count;      }    }    catch(InterruptedIOException e){      len=e.bytesTransferred;      iioe=e;    }    count+=len;    // copy bytes from the middle to the front of the array, expanding LF->CR/LF    while(len-->0){      byte b=buffer[j++];      if(b=='\n'){        buffer[off++]='\r';        count++;      }      buffer[off++]=b;    }    if(iioe!=null){      iioe.bytesTransferred=count;      throw iioe;    }    return count;  }  /**   * Calls read() to skip the specified number of bytes   * @throws InterruptedIOException if the operation was interrupted before all of the   *         bytes specified have been skipped, bytesTransferred may be non-zero   * @throws IOException if an i/o error occurs   */  public long skip(long count) throws IOException{    int actualCount=0; // assumes count < Integer.MAX_INT    try{      while(count-->0&&read()!=-1)        actualCount++; // skip the specified number of bytes      return actualCount;    }    catch(InterruptedIOException e){      e.bytesTransferred=actualCount;      throw e;    }  }  /**   * Wraps the underlying stream's method.   * Returns the number of bytes that can be read without blocking; accounts for   * possible translation of LFs to CR/LF sequences in these bytes.   * @throws IOException if an i/o error occurs   */  public int available() throws IOException{    return in.available(); // we can guarantee at least this amount after expansion  }  /**   * Mark is not supported by the wrapper even if the underlying stream does, returns false.   */  public boolean markSupported(){    return false;  }}

⌨️ 快捷键说明

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