Java 获取相对路径问题 System.getProperty("user.dir");

Java 获取相对路径问题 System.getProperty("user.dir");,第1张

不要用userdir,这个是根据你的运行环境改变的。

我也做过很多有upload的项目,都是用property文件定义一个绝对路径去存放上传的文件的。服务器端没有必要使用相对路径。

客户端的东西都使用相对路径,因为对于客户端来说,绝对路径是服务器的绝对路径,客户端是不能访问的。

所以,不知道你为什么要在服务器端使用相对路径,对于web开发来说,是没有意义的。

第一步:需要先创建一个server,可以通过windows中的show view,之后找到server,

第二步:在server窗口中右击,选择”new-server“,之后创建好tomcat server。

第三步:双击创建的server,进入server设置界面,设置Server Location,选择编译路径是”Use Tomcat“即可切换到Tomcat的路径,保存。

第四步:在创建的server上右击,选择add,之后将要运行的项目添加进来,选择Finsh。

第五步:右击server,之后选择”start“运行即可。

第六步:打开浏览器,输入”http://localhost:8080/项目root“运行即可。

使用下面这个PathUtil的getProgramPath()就可以获得当前程序运行的目录

import javanetURL;

import javanetURLDecoder;

class PathUtil {

/

Get the env of windir, such as "C:\WINDOWS"

@return the env of windir value

/

public static String getWindir() {

return Systemgetenv("windir");

}

/

Get file separator, such as "/" on unix

@return the separator of file

/

public static String getFileSeparator() {

return SystemgetProperty("fileseparator");

}

/

Get line separator, such as "\n" on unix

@return the separator of line

/

public static String getLineSeparator() {

return SystemgetProperty("lineseparator");

}

/

Get programPath

@return programPath

/

public static String getProgramPath() {

Class<PathUtil> cls = PathUtilclass;

ClassLoader loader = clsgetClassLoader();

//

// Get the full name of the class

//

String clsName = clsgetName() + "class";

//

// Get the package that include the class

//

Package pack = clsgetPackage();

String path = "";

//

// Transform package name to path

//

if (pack != null) {

String packName = packgetName();

//

// Get the class's file name

//

clsName = clsNamesubstring(packNamelength() + 1);

//

// If package is simple transform package name to path directly,

// else transform package name to path by package name's

// constituent

//

path = packName;

if (pathindexOf("") > 0) {

path = pathreplace("", "/");

}

path = path + "/";

}

URL url = loadergetResource(path + clsName);

//

// Get path information form the instance of URL

//

String retPath = urlgetPath();

//

// Delete protocol name "file:" form path information

//

try {

int pos = retPathindexOf("file:");

if (pos > -1) {

retPath = retPathsubstring(pos + 5);

}

//

// Delete the information of class file from the information of

// path

//

pos = retPathindexOf(path + clsName);

retPath = retPathsubstring(0, pos - 1);

//

// If the class file was packageed into JAR eg file, delete the

// file name of the corresponding JAR eg

//

if (retPathendsWith("!")) {

retPath = retPathsubstring(0, retPathlastIndexOf("/"));

}

retPath = URLDecoderdecode(retPath, "utf-8");

} catch (Exception e) {

retPath = null;

eprintStackTrace();

}

return retPath;

}

}

测试类:

public class Test{

public static void main(String args[]){

String s = PathUtilgetProgramPath();

Systemoutprintln(s);

}

}

一个例子,如果有一个Test文件夹里面有testjava和hellotxt如果你想用testjava操作hellotxt

只要在testjava中这样写File file=new File("hellotxt");//这样就是相对路径。如果文件结构是

Test文件夹

|------testjava

|------hellotxt

|------source文件夹

|---------worldtxt

如果想在testjava中操作worldtxt。只要这样写File file=new File("source/worldtxt");

另外,在web开发中/代表项目文件夹根目录,当然也有可能代替webapps,区分方法是:如果/开头的uri是给浏览器解析则/代表webapps,如果是给服务器后台解析,则代表项目文件

拿去用吧。

package comweixinutil;

import javaioFile;

import javaioFileOutputStream;

import javaioIOException;

import javaioInputStream;

import javaioOutputStream;

import javaioPrintWriter;

import javaioRandomAccessFile;

import orgapachecommonsnetPrintCommandListener;

import orgapachecommonsnetftpFTP;

import orgapachecommonsnetftpFTPClient;

import orgapachecommonsnetftpFTPFile;

import orgapachecommonsnetftpFTPReply;

import comweixinconstantDownloadStatus;

import comweixinconstantUploadStatus;

/

  支持断点续传的FTP实用类

  @version 01 实现基本断点上传下载

  @version 02 实现上传下载进度汇报

  @version 03 实现中文目录创建及中文文件创建,添加对于中文的支持

 /

public class ContinueFTP {

public FTPClient ftpClient = new FTPClient();

public ContinueFTP(){

//设置将过程中使用到的命令输出到控制台

thisftpClientaddProtocolCommandListener(new PrintCommandListener(new PrintWriter(Systemout)));

}

/

  连接到FTP服务器

  @param hostname 主机名

  @param port 端口

  @param username 用户名

  @param password 密码

  @return 是否连接成功

  @throws IOException

 /

public boolean connect(String hostname,int port,String username,String password) throws IOException{

ftpClientconnect(hostname, port);

ftpClientsetControlEncoding("GBK");

if(FTPReplyisPositiveCompletion(ftpClientgetReplyCode())){

if(ftpClientlogin(username, password)){

return true;

}

}

disconnect();

return false;

}

/

  从FTP服务器上下载文件,支持断点续传,上传百分比汇报

  @param remote 远程文件路径

  @param local 本地文件路径

  @return 上传的状态

  @throws IOException

 /

public DownloadStatus download(String remote,String local) throws IOException{

//设置被动模式

ftpCliententerLocalPassiveMode();

//设置以二进制方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

DownloadStatus result;

//检查远程文件是否存在

FTPFile[] files = ftpClientlistFiles(new String(remotegetBytes("GBK"),"iso-8859-1"));

if(fileslength != 1){

Systemoutprintln("远程文件不存在");

return DownloadStatusRemote_File_Noexist;

}

long lRemoteSize = files[0]getSize();

File f = new File(local);

//本地存在文件,进行断点下载

if(fexists()){

long localSize = flength();

//判断本地文件大小是否大于远程文件大小

if(localSize >= lRemoteSize){

Systemoutprintln("本地文件大于远程文件,下载中止");

return DownloadStatusLocal_Bigger_Remote;

}

//进行断点续传,并记录状态

FileOutputStream out = new FileOutputStream(f,true);

ftpClientsetRestartOffset(localSize);

InputStream in = ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=localSize /step;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes,0,c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean isDo = ftpClientcompletePendingCommand();

if(isDo){

result = DownloadStatusDownload_From_Break_Success;

}else {

result = DownloadStatusDownload_From_Break_Failed;

}

}else {

OutputStream out = new FileOutputStream(f);

InputStream in= ftpClientretrieveFileStream(new String(remotegetBytes("GBK"),"iso-8859-1"));

byte[] bytes = new byte[1024];

long step = lRemoteSize /100;

long process=0;

long localSize = 0L;

int c;

while((c = inread(bytes))!= -1){

outwrite(bytes, 0, c);

localSize+=c;

long nowProcess = localSize /step;

if(nowProcess > process){

process = nowProcess;

if(process % 10 == 0)

Systemoutprintln("下载进度:"+process);

//TODO 更新文件下载进度,值存放在process变量中

}

}

inclose();

outclose();

boolean upNewStatus = ftpClientcompletePendingCommand();

if(upNewStatus){

result = DownloadStatusDownload_New_Success;

}else {

result = DownloadStatusDownload_New_Failed;

}

}

return result;

}

/

  上传文件到FTP服务器,支持断点续传

  @param local 本地文件名称,绝对路径

  @param remote 远程文件路径,使用/home/directory1/subdirectory/fileext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构

  @return 上传结果

  @throws IOException

 /

public UploadStatus upload(String local,String remote) throws IOException{

//设置PassiveMode传输

ftpCliententerLocalPassiveMode();

//设置以二进制流的方式传输

ftpClientsetFileType(FTPBINARY_FILE_TYPE);

ftpClientsetControlEncoding("GBK");

UploadStatus result;

//对远程目录的处理

String remoteFileName = remote;

if(remotecontains("/")){

remoteFileName = remotesubstring(remotelastIndexOf("/")+1);

//创建服务器远程目录结构,创建失败直接返回

if(CreateDirecroty(remote, ftpClient)==UploadStatusCreate_Directory_Fail){

return UploadStatusCreate_Directory_Fail;

}

}

//检查远程是否存在文件

FTPFile[] files = ftpClientlistFiles(new String(remoteFileNamegetBytes("GBK"),"iso-8859-1"));

if(fileslength == 1){

long remoteSize = files[0]getSize();

File f = new File(local);

long localSize = flength();

if(remoteSize==localSize){

return UploadStatusFile_Exits;

}else if(remoteSize > localSize){

return UploadStatusRemote_Bigger_Local;

}

//尝试移动文件内读取指针,实现断点续传

result = uploadFile(remoteFileName, f, ftpClient, remoteSize);

//如果断点续传没有成功,则删除服务器上文件,重新上传

if(result == UploadStatusUpload_From_Break_Failed){

if(!ftpClientdeleteFile(remoteFileName)){

return UploadStatusDelete_Remote_Faild;

}

result = uploadFile(remoteFileName, f, ftpClient, 0);

}

}else {

result = uploadFile(remoteFileName, new File(local), ftpClient, 0);

}

return result;

}

/

  断开与远程服务器的连接

  @throws IOException

 /

public void disconnect() throws IOException{

if(ftpClientisConnected()){

ftpClientdisconnect();

}

}

/

  递归创建远程服务器目录

  @param remote 远程服务器文件绝对路径

  @param ftpClient FTPClient对象

  @return 目录创建是否成功

  @throws IOException

 /

public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{

UploadStatus status = UploadStatusCreate_Directory_Success;

String directory = remotesubstring(0,remotelastIndexOf("/")+1);

if(!directoryequalsIgnoreCase("/")&&!ftpClientchangeWorkingDirectory(new String(directorygetBytes("GBK"),"iso-8859-1"))){

//如果远程目录不存在,则递归创建远程服务器目录

int start=0;

int end = 0;

if(directorystartsWith("/")){

start = 1;

}else{

start = 0;

}

end = directoryindexOf("/",start);

while(true){

String subDirectory = new String(remotesubstring(start,end)getBytes("GBK"),"iso-8859-1");

if(!ftpClientchangeWorkingDirectory(subDirectory)){

if(ftpClientmakeDirectory(subDirectory)){

ftpClientchangeWorkingDirectory(subDirectory);

}else {

Systemoutprintln("创建目录失败");

return UploadStatusCreate_Directory_Fail;

}

}

start = end + 1;

end = directoryindexOf("/",start);

//检查所有目录是否创建完毕

if(end <= start){

break;

}

}

}

return status;

}

/

  上传文件到服务器,新上传和断点续传

  @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变

  @param localFile 本地文件File句柄,绝对路径

  @param processStep 需要显示的处理进度步进值

  @param ftpClient FTPClient引用

  @return

  @throws IOException

 /

public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{

UploadStatus status;

//显示进度的上传

long step = localFilelength() / 100;

long process = 0;

long localreadbytes = 0L;

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

OutputStream out = ftpClientappendFileStream(new String(remoteFilegetBytes("GBK"),"iso-8859-1"));

//断点续传

if(remoteSize>0){

ftpClientsetRestartOffset(remoteSize);

process = remoteSize /step;

rafseek(remoteSize);

localreadbytes = remoteSize;

}

byte[] bytes = new byte[1024];

int c;

while((c = rafread(bytes))!= -1){

outwrite(bytes,0,c);

localreadbytes+=c;

if(localreadbytes / step != process){

process = localreadbytes / step;

Systemoutprintln("上传进度:" + process);

//TODO 汇报上传状态

}

}

outflush();

rafclose();

outclose();

boolean result =ftpClientcompletePendingCommand();

if(remoteSize > 0){

status = resultUploadStatusUpload_From_Break_Success:UploadStatusUpload_From_Break_Failed;

}else {

status = resultUploadStatusUpload_New_File_Success:UploadStatusUpload_New_File_Failed;

}

return status;

}

public static void main(String[] args) {

ContinueFTP myFtp = new ContinueFTP();

try {

Systemerrprintln(myFtpconnect("10106236", 21, "5", "jieyan"));

// myFtpftpClientmakeDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientchangeWorkingDirectory(new String("歌曲"getBytes("GBK"),"iso-8859-1"));

// myFtpftpClientmakeDirectory(new String("爱你等于爱自己"getBytes("GBK"),"iso-8859-1"));

// Systemoutprintln(myFtpupload("E:\\ywflv", "/ywflv",5));

// Systemoutprintln(myFtpupload("E:\\爱你等于爱自己mp4","/爱你等于爱自己mp4"));

//Systemoutprintln(myFtpdownload("/爱你等于爱自己mp4", "E:\\爱你等于爱自己mp4"));

myFtpdisconnect();

} catch (IOException e) {

Systemoutprintln("连接FTP出错:"+egetMessage());

}

}

}

java项目中文件的路径-方法大全

一、 相对路径的获得

说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)

SystemgetProperty("userdir");

上述相对路径中,java项目中的文件是相对于项目的根目录web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于tomcat安装目录\bin)

二 类加载目录的获得(即当运行时某一类时获得其装载目录)

11)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)

InputStreamis=TestActionclassgetClassLoader()getResourceAsStream("testtxt"); (testtxt文件的路径为 项目名\src\testtxt;类TestPath所在包的第一级目录位于src目录下)

上式中将TestPath,testtxt替换成对应成相应的类名和文件名字即可

12)通用方法二 (此方法和11中的方法类似,不同的是此方法必须以'/'开头) InputStream is=Test1classgetResourceAsStream("/testtxt"); 

(testtxt文件的路径为 项目名\src\testtxt,类Test1所在包的第一级目录位于src目录下)

三 web项目根目录的获得(发布之后)

1 从servlet出发

可建立一个servlet在其的init方法中写入如下语句(没有请求的话会抛空指针导常)

ServletContext s1=thisgetServletContext();

String temp=s1getRealPath("/"); (关键) 

结果形如:F:\tomcat-6036\webapps\test\(test为项目名字)

如果是调用了s1getRealPath("")则输出F:\tomcat-6036\webapps\test(少了一个"\")

2 从httpServletRequest出发(没有请求的话会抛空指针导常)

String path=requestgetSession()getServletContext()getRealPath("/");

结果形如: F:\tomcat-6036\webapps\test\

 

四 classpath的获取(在Eclipse中为获得src或者classes目录的路径),放在监听器,可以窗口启动获取路径

方法一 ThreadcurrentThread()getContextClassLoader()getResource("")getPath()

 

    String path = ThreadcurrentThread()getContextClassLoader()

              getResource("")getPath();

    Systemoutprintln("path========" + path);输出: path========/F:/tomcat-6036/webapps/test/WEB-INF/classes/

方法二 JdomParseclassgetClassLoader()getResource("")getPath() (JdomParse为src某一个包中的类,下同)

eg:String p1=JdomParseclassgetClassLoader()getResource("")getPath();

Systemoutprintln("JdomParseclassgetClassLoader()getResource--"+p1);

输出:JdomParseclassgetClassLoader()getResource-/F:/tomcat-6036/webapps/test/WEB-INF/classes/

 

另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)

eg String p2=JdomParseclassgetResource("")getPath(); 

Systemoutprintln("JdomParseclassgetResource---"+p2);

输出:JdomParseclassgetResource--/F:/tomcat-6036/webapps/test/WEB-INF/classes/

 (JdomParse为src目录下jdom包中的类)

四 属性文件的读取:

方法 一

InputStream in = lnewBufferedInputStream( new FileInputStream(name));   

 Properties p = new Properties();   pload(in);

 

注意路径的问题,做执行之后就可以调用pgetProperty("name")得到对应属性的值

 

方法二

Locale locale =LocalegetDefault(); 

ResourceBundle localResource = ResourceBundlegetBundle("test/propertiesTest",locale); 

String value = localResourcegetString("test"); 

Systemoutprintln("ResourceBundle: " + value);

工程src目录下propertiesTestproperties(名字后缀必须为properties)文件内容如下:

test=hello word

不通过Servlet获取路径 

第一种实现

Java代码  

       URL url = ClassLoadergetSystemClassLoader()getResource("/"); 

       File file =new File(urlgetPath()); 

       File parentFile =new File(filegetParent()); 

       Systemoutprintln("webRoot:"+parentFilegetParent());

第二种实现 

首先写一个接听类 (推荐使用,容器启动时就执行,不会抛空指针异常,适合做定时器任务来删除服务器文件的路径)

Java代码:

package comchinacreatorreportlistener; 

import javaxservletServletContext;

import javaxservletServletContextEvent;

import javaxservletServletContextListener;

 

/

  @authorxiaoqunyi

 /

public class PathListener implementsServletContextListener {

 

    private staticServletContext servletContext;

 

    public voidcontextDestroyed(ServletContextEvent sce) {

 

       thisservletContext= scegetServletContext();

       Systemoutprintln("path=======:"+servletContextgetRealPath("/"));

    }

 

    public voidcontextInitialized(ServletContextEvent arg0) {

 

    }

 

}

在webxml中加入如下配置

Java代码 :

<listener>

       <listener-class>comchinacreatorreportlistenerPathListener</listener-class>

    </listener> 

五、Java中的getResourceAsStream有以下几种: 

1 ClassgetResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由 ClassLoader(类加载器)(获取资源)

2 ClassgetClassLoadergetResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。

3 ServletContext getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。

4 Jsp下的application内置对象就是上面的ServletContext的一种实现。 

其次,getResourceAsStream 用法大致有以下几种: 

第一: 要加载的文件和class文件在同一目录下,例如:comxy 下有类meclass ,同时有资源文件myfilexml 

那么,应该有如下代码: 

meclassgetResourceAsStream("myfilexml"); 

第二:在meclass目录的子目录下,例如:comxy 下有类meclass ,同时在 comxyfile 目录下有资源文件myfilexml 

那么,应该有如下代码: 

meclassgetResourceAsStream("file/myfilexml"); 

第三:不在meclass目录下,也不在子目录下,例如:comxy 下有类meclass ,同时在 comxfile 目录下有资源文件myfilexml

那么,应该有如下代码: 

meclassgetResourceAsStream("/com/x/file/myfilexml"); 

总结一下,可能只是两种写法 

第一:前面有 “   / ” 

“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject 

meclassgetResourceAsStream("/com/x/file/myfilexml"); 

第二:前面没有 “   / ” 

代表当前类的目录 

meclassgetResourceAsStream("myfilexml"); 

meclassgetResourceAsStream("file/myfilexml");

文件从本地到服务器的功能,其实是为了解决目前浏览器不支持获取本地文件全路径。不得已而想到上传到服务器的固定目录,从而方便项目获取文件,进而使程序支持EXCEL批量导入数据。

java中文件上传到服务器的指定路径的代码:

在前台界面中输入:

<form method="post" enctype="multipart/form-data"  action="/manage/excelImportdo">

请选文件:<input type="file"  name="excelFile">

<input type="submit" value="导入" onclick="return impExcel();"/>

</form>

action中获取前台传来数据并保存

/

excel 导入文件

@return

@throws IOException

/

@RequestMapping("/usermanager/excelImportdo")

public String excelImport(

String filePath,

MultipartFile  excelFile,HttpServletRequest request) throws IOException{

loginfo("<<<<<<action:{} Method:{} start>>>>>>","usermanager","excelImport" );

if (excelFile != null){

String filename=excelFilegetOriginalFilename();

String a=requestgetRealPath("u/cms/www/201509");

SaveFileFromInputStream(excelFilegetInputStream(),requestgetRealPath("u/cms/www/201509"),filename);//保存到服务器的路径

}

loginfo("<<<<<<action:{} Method:{} end>>>>>>","usermanager","excelImport" );

return "";

}

/

将MultipartFile转化为file并保存到服务器上的某地

/

public void SaveFileFromInputStream(InputStream stream,String path,String savefile) throws IOException

{      

FileOutputStream fs=new FileOutputStream( path + "/"+ savefile);

Systemoutprintln("------------"+path + "/"+ savefile);

byte[] buffer =new byte[10241024];

int bytesum = 0;

int byteread = 0;

while ((byteread=streamread(buffer))!=-1)

{

bytesum+=byteread;

fswrite(buffer,0,byteread);

fsflush();

}

fsclose();

streamclose();

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Java 获取相对路径问题 System.getProperty("user.dir");

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情