我是一个相对较新的Java新手,在添加到文本文件时有一点困难。我可以创建并写入该文件,但如果该文件存在,我只能覆盖它。
我试图使用StandardOpenOption,但这需要SDK26(我正在为Android7或更高版本开发),这意味着我不能使用StandardOpenOption,因为Min。
有没有其他方法可以做到这一点?这是我目前正在运行的代码,这是使用hierynomus访问Windows网络路径的代码
import android.content.Context;
import com.hierynomus.msdtyp.AccessMask;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.mssmb2.SMB2CreateDisposition;
import com.hierynomus.mssmb2.SMB2CreateOptions;
import com.hierynomus.mssmb2.SMB2ShareAccess;
import com.hierynomus.mssmb2.SMBApiException;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.SmbConfig;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
public class NetworkLogon {
// connection paramsStaticLoggerBinder
static String sambaDomain = null; // can be null
// Need to pass over Message (What to print) Filename, Folder. As this could be writing an Out and a Log file.
public static void main(Context mContext, String message, String filename, String Folder) throws IOException {
String sambaSharedPath = SharedPrefs.getserverPath(mContext);
String sambaUsername = SharedPrefs.getsmbUser(mContext);
String sambaPass = SharedPrefs.getsmbPass(mContext);
String sambaIP = SharedPrefs.getserverName(mContext);
// String filename = "test.txt";
SmbConfig cfg = SmbConfig.builder().build();
SMBClient client = new SMBClient(cfg);
Connection connection = client.connect(sambaIP);
Session session = connection.authenticate(new AuthenticationContext(sambaUsername, sambaPass.toCharArray(), sambaDomain));
DiskShare share = (DiskShare) session.connectShare(sambaSharedPath);
// this is com.hierynomus.smbj.share.File !
File f = null;
int idx = filename.lastIndexOf("/");
// if file is in folder(s), create them first
if (idx > -1) {
String folder = Folder+"\\"+filename.substring(0, idx);
try {
if (!share.folderExists(folder)) share.mkdir(folder);
} catch (SMBApiException ex) {
throw new IOException(ex);
}
}
if (!share.fileExists(Folder+"\\"+filename)) {
f = share.openFile(Folder+"\\"+filename,
new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
SMB2ShareAccess.ALL,
SMB2CreateDisposition.FILE_CREATE,
new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE))
);
}
if (f == null){
f = share.openFile(Folder+"\\"+filename,
new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
SMB2ShareAccess.ALL,
SMB2CreateDisposition.FILE_OPEN_IF,
new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)) );
}
OutputStream os = f.getOutputStream();
os.write(message.getBytes());
os.flush();
os.close();
f.close();
}
}发布于 2020-01-08 23:13:36
我尝试了各种方法,但都没有成功,我决定不再使用hierynomus.smbj,因为在尝试使用不同的函数时,我在类中遇到了各种错误。并决定使用jcif,并立即工作,没有任何问题。
下面是一个代码示例:
// required imports
import android.content.Context;
import java.io.IOException;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
public class NetworkLogon {
public static void main(Context mContext, String message, String filename, String Folder) throws IOException {
String sambaSharedPath = SharedPrefs.getserverPath(mContext);
String sambaUsername = SharedPrefs.getsmbUser(mContext);
String sambaPass = SharedPrefs.getsmbPass(mContext);
String sambaIP = SharedPrefs.getserverName(mContext);
try{
String url = "smb://"+sambaIP+"/"+ sambaSharedPath +"/"+ Folder +"/"+ filename;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
null, sambaUsername, sambaPass);
SmbFile sfile = new SmbFile(url, auth);
SmbFileOutputStream sfos = new SmbFileOutputStream(sfile, true);
sfos.write((message+"\n").getBytes());
sfos.close();
}catch(Exception e){
throw new IOException(e);
}
}
}对任何新手的代码的解释:
public static void main(Context mContext, String message, String filename, String Folder) throws IOException {Context mContext,String message filename Folder用于传递调用位置的内容:示例:
String Folder ="Logs";
String message = timedateFormat+": Login Failed, Details are incorrect";
String filename = dateNow+"-AndroidHandHeld.log";
NetworkLogon.main(mContext, message, filename, Folder);你当然可以自由输入:
NetworkLogon.main(mContext, "Yourmessage", "Somefilename", "SomeFolder");代码的SharedPrefs部分是另一个获取SharedPreferences中存储的详细信息的类。
字符串url将网络路径、共享文件夹、文件夹和文件名放在一起。
NtlmPasswordAuthentication启动身份验证。我的代码中的参数( Domain,用户名,密码)显示域为空,因为我目前还没有完成域的定义。
SmbFile使用路径+身份验证方法进行连接。
Outputstream正在设置文件并说要追加
然后,其他两行写出该文件并关闭该文件
https://stackoverflow.com/questions/59643352
复制相似问题