IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Java统计svn管理的代码 -> 正文阅读

[开发工具]Java统计svn管理的代码

package util;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNLogEntryPath;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

public class SvnStatistical {
?? ?//svn账号
?? ?private static String userName = "";
?? ?//svn密码
?? ?private static String password = "";
?? ?//svn地址,注意地址以svn开始和以https开始的调用的方法是不一样的,SVNRepository jar里会自动区分
? ? private static String urlString = "";
? ? //临时文件存放地址
? ? private static String tempDir = "E:\\demo\\";
? ? //提交人
? ? private static String submitAuth = "";
? ? private static DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(true);
? ? //临时文件名
? ? private static Random random = new Random();
? ? private static SVNRepository repos;
? ? private static ISVNAuthenticationManager authManager;
? ? //新增文件数量
? ? private static int addFileNum = 0;
? ? //修改文件数量
? ? private static int updateFileNum = 0;
? ??
? ? public static void main(String[] args) throws ParseException, SVNException {
? ? ?? ?authManager = SVNWCUtil.createDefaultAuthenticationManager(new File(tempDir+"/auth"), userName, password.toCharArray());
? ? ? ? options.setDiffCommand("-x -w");
? ? ? ? repos = SVNRepositoryFactory.create(SVNURL
? ? ? ? ? ? ? ? ?.parseURIEncoded(urlString));
? ? ? ? repos.setAuthenticationManager(authManager);
? ? ? ? Calendar calendar = Calendar.getInstance();

????????if(calendar.get(Calendar.DAY_OF_WEEK)==2) {//如果当天是周一则需要统计周五至周天的数据
? ? ? ? ? ? calendar.add(Calendar.DAY_OF_MONTH, -3);
? ? ? ? } else {
? ? ? ? ?? ?calendar.add(Calendar.DAY_OF_MONTH, -1);
? ? ? ? }
? ? ? ? SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
? ? ? ? //统计昨天代码提交情况
? ? ? ? Date after = format.parse(format.format(new Date()));
? ? ? ? Date before = format.parse(format.format(calendar.getTime()));
? ? ? ? try {
? ? ? ? ? ? int sum = staticticsCodeAddByTime(before, after);
? ? ? ? ? ? submitAuth = submitAuth.substring(1,submitAuth.length());
? ? ? ? ? ? int total = updateFileNum+addFileNum;
? ? ? ? ? ? System.out.println("代码提交明细\n"+format.format(before)+" 00:00:00 to "+format.format(before)+" 23:59:59"
? ? ? ? ? ? ?? ??? ??? ??? ??? ?+ "\n提交行数:sum="+sum+""
? ? ? ? ? ? ?? ??? ??? ??? ??? ?+ "\n涉及文件"+total+"个,其中修改文件"+updateFileNum+"个,新增文件"+addFileNum+"个"
? ? ? ? ? ? ?? ??? ??? ??? ??? ?+ "\n提交人:"+submitAuth);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? //获取(st,et)时间内的提交记录
? ? public static SVNLogEntry[] getLogByTime(Date st, Date et) throws SVNException{
? ? ? ? long startRevision = repos.getDatedRevision(st)+1;//有时计算的第一个version号不对所以在调用时注意
? ? ? ? long endRevision = repos.getDatedRevision(et);
? ? ? ? System.out.println("=======startRevision========"+startRevision);
? ? ? ? System.out.println("=======endRevision========"+endRevision);
? ? ? ? @SuppressWarnings("unchecked")
? ? ? ? Collection<SVNLogEntry> logEntries = repos.log(new String[]{""}, null,
? ? ? ? ? ? ? ? startRevision, endRevision, true, true);
? ? ? ? SVNLogEntry[] svnLogEntries = logEntries.toArray(new SVNLogEntry[0]);
? ? ? ? return svnLogEntries;
? ? }
? ? //获取版本比较日志,并存入临时文件
? ? public static File getChangeLog(long startVersion, long endVersion) throws SVNException, IOException{
? ? ? ? SVNDiffClient diffClient = new SVNDiffClient(authManager, options);
? ? ? ? diffClient.setGitDiffFormat(true);
? ? ? ? File tempLogFile = null;
? ? ? ? OutputStream outputStream = null;
? ? ? ? String svnDiffFile = null;
? ? ? ? do {
? ? ? ? ? ? svnDiffFile = tempDir + "/svn_diff_file_"+startVersion+"_"+endVersion+"_"+random.nextInt(10000)+".txt";
? ? ? ? ? ? tempLogFile = new File(svnDiffFile);
? ? ? ? } while (tempLogFile != null && tempLogFile.exists());
? ? ? ? try {
? ? ? ? ? ? tempLogFile.createNewFile();
? ? ? ? ? ? outputStream = new FileOutputStream(svnDiffFile);
? ? ? ? ? ? diffClient.doDiff(SVNURL.parseURIEncoded(urlString),
? ? ? ? ? ? ? ? ? ? SVNRevision.create(startVersion),
? ? ? ? ? ? ? ? ? ? SVNURL.parseURIEncoded(urlString),
? ? ? ? ? ? ? ? ? ? SVNRevision.create(endVersion),
? ? ? ? ? ? ? ? ? ? org.tmatesoft.svn.core.SVNDepth.UNKNOWN, true, outputStream);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }finally {
? ? ? ? ? ? if(outputStream!=null)
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? outputStream.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? } ??
? ? ? ? return tempLogFile;
? ? }
? ? //分析变更的代码,统计代码增量
? ? public static int staticticsCodeAdd(File file) throws Exception{
? ? ? ? System.out.println("开始统计修改代码行数");
? ? ? ? FileReader fileReader = new FileReader(file);
? ? ? ? BufferedReader in = new BufferedReader(fileReader);
? ? ? ? int sum = 0;
? ? ? ? String line = null;
? ? ? ? StringBuffer buffer = new StringBuffer(1024);
? ? ? ? boolean start = false;
? ? ? ? while((line=in.readLine()) != null){
? ? ? ? ? ? if(line.startsWith("Index:")){
? ? ? ? ? ? ? ? if(start){
? ? ? ? ? ? ? ? ? ? ChangeFile changeFile = parseChangeFile(buffer);
? ? ? ? ? ? ? ? ? ? //只统计了Java文件和jsp文件
? ? ? ? ? ? ? ? ? ? if(changeFile.getFilePath().indexOf(".java")>-1 || changeFile.getFilePath().indexOf(".jsp")>-1) {
? ? ? ? ? ? ? ? ? ? ?? ?int oneSize = staticOneFileChange(changeFile);
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("filePath="+changeFile.getFilePath()+" ?changeType="+changeFile.getChangeType()+" ?addLines="+oneSize);
? ? ? ? ? ? ? ? ? ? ? ? sum += oneSize;
? ? ? ? ? ? ? ? ? ? ? ? if(changeFile.getChangeType().compareTo(new Character('A'))==0) {
? ? ? ? ? ? ? ? ? ? ?? ??? ?addFileNum = addFileNum+1;
? ? ? ? ? ? ? ? ? ? ?? ?}else if(changeFile.getChangeType().compareTo(new Character('M'))==0) {
? ? ? ? ? ? ? ? ? ? ?? ??? ?updateFileNum = updateFileNum+1;
? ? ? ? ? ? ? ? ? ? ?? ?}
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? buffer.setLength(0);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? start = true;
? ? ? ? ? ? }
? ? ? ? ? ? buffer.append(line).append('\n');
? ? ? ? }
? ? ? ? if(buffer.length() > 0){
? ? ? ? ? ? ChangeFile changeFile = parseChangeFile(buffer);
? ? ? ? ? ? if(changeFile.getFilePath().indexOf(".java")>-1 || changeFile.getFilePath().indexOf(".jsp")>-1) {
? ? ? ? ? ? ?? ?int oneSize = staticOneFileChange(changeFile);
? ? ? ? ? ? ?? ?if(changeFile.getChangeType().compareTo(new Character('A'))==0) {
? ? ? ? ? ? ?? ??? ?addFileNum = addFileNum+1;
? ? ? ? ? ? ?? ?}else if(changeFile.getChangeType().compareTo(new Character('M'))==0) {
? ? ? ? ? ? ?? ??? ?updateFileNum = updateFileNum+1;
? ? ? ? ? ? ?? ?}
? ? ? ? ? ? ? ? System.out.println("filePath="+changeFile.getFilePath()+" ?changeType="+changeFile.getChangeType()+" ?addLines="+oneSize);
? ? ? ? ? ? ? ? sum += oneSize;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? in.close();
? ? ? ? fileReader.close();
? ? ? ? boolean deleteFile = file.delete();
? ? ? ? System.out.println("-----delete file-----"+deleteFile);
? ? ? ? return sum;
? ? }
? ? //统计单个文件的增加行数,(先通过过滤器,如文件后缀、文件路径等等),也可根据修改类型来统计等,这里只统计增加或者修改的文件
? ? public static int staticOneFileChange(ChangeFile changeFile){
? ? ? ? char changeType = changeFile.getChangeType();
? ? ? ? if(changeType == 'A'){
? ? ? ? ? ? return countAddLine(changeFile.getFileContent());
? ? ? ? }else if(changeType == 'M'){
? ? ? ? ? ? return countAddLine(changeFile.getFileContent());
? ? ? ? }else if(changeType == 'D'){
? ? ? ? ? ? return countAddLine(changeFile.getFileContent());
? ? ? ? }
? ? ? ? return 0;
? ? }
? ? //解析单个文件变更日志
? ? public static ChangeFile parseChangeFile(StringBuffer str){
? ? ? ? int index = str.indexOf("\n@@");
? ? ? ? if(index > 0){
? ? ? ? ? ? String header = str.substring(0, index);
? ? ? ? ? ? String[] headers = header.split("\n");
? ? ? ? ? ? String filePath = headers[0].substring(7);
? ? ? ? ? ? char changeType = 'U';
? ? ? ? ? ? boolean oldExist = !headers[2].endsWith("(nonexistent)");
? ? ? ? ? ? boolean newExist = !headers[3].endsWith("(nonexistent)");
? ? ? ? ? ? if(oldExist && !newExist){
? ? ? ? ? ? ? ? changeType = 'D';
? ? ? ? ? ? }else if(!oldExist && newExist){
? ? ? ? ? ? ? ? changeType = 'A';
? ? ? ? ? ? }else if(oldExist && newExist){
? ? ? ? ? ? ? ? changeType = 'M';
? ? ? ? ? ? }
? ? ? ? ? ? int bodyIndex = str.indexOf("@@\n")+3;
? ? ? ? ? ? String body = str.substring(bodyIndex);
? ? ? ? ? ? ChangeFile changeFile = new ChangeFile(filePath, changeType, body);
? ? ? ? ? ? return changeFile;
? ? ? ? }else{
? ? ? ? ? ? String[] headers = str.toString().split("\n");
? ? ? ? ? ? String filePath = headers[0].substring(7);
? ? ? ? ? ? ChangeFile changeFile = new ChangeFile(filePath, 'U', null);
? ? ? ? ? ? return changeFile;
? ? ? ? }
? ? }
? ??
? ? //通过比较日志,统计以+号开头的非空行(有效代码)
? ? public static int countAddLine(String content){
? ? ? ? int sum = 0;
? ? ? ? if(content !=null){
? ? ? ? ? ? content = '\n' + content +'\n';
? ? ? ? ? ? char[] chars = content.toCharArray();
? ? ? ? ? ? int len = chars.length;
? ? ? ? ? ? //判断当前行是否以+号开头
? ? ? ? ? ? boolean startPlus = false;
? ? ? ? ? ? //判断当前行,是否为空行(忽略第一个字符为加号)
? ? ? ? ? ? boolean notSpace = false;
? ? ? ? ? ??
? ? ? ? ? ? for(int i=0;i<len;i++){
? ? ? ? ? ? ? ? char ch = chars[i];
? ? ? ? ? ? ? ? if(ch =='\n'){
? ? ? ? ? ? ? ? ? ? //当当前行是+号开头,同时其它字符都不为空,则行数+1
? ? ? ? ? ? ? ? ? ? if(startPlus && notSpace){
? ? ? ? ? ? ? ? ? ? ? ? sum++;
? ? ? ? ? ? ? ? ? ? ? ? notSpace = false;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //为下一行做准备,判断下一行是否以+头
? ? ? ? ? ? ? ? ? ? if(i < len-1 && chars[i+1] == '+'){
? ? ? ? ? ? ? ? ? ? ? ? startPlus = true;
? ? ? ? ? ? ? ? ? ? ? ? //跳过下一个字符判断,因为已经判断了
? ? ? ? ? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? startPlus = false;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }else if(startPlus && ch > ' '){//如果当前行以+开头才进行非空行判断
? ? ? ? ? ? ? ? ? ? notSpace = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ??
? ? ? ? return sum;
? ? }
? ? //统计一段时间内代码增加量
? ? public static int staticticsCodeAddByTime(Date st, Date et) throws Exception{
? ? ? ? int sum = 0;
? ? ? ? SVNLogEntry[] logs = getLogByTime(st, et);
? ? ? ? if(logs.length > 0){
? ? ? ? ? ? long lastVersion = logs[0].getRevision()-1;
? ? ? ? ? ? for(SVNLogEntry log:logs){
? ? ? ? ? ? ?? ?Map<String, SVNLogEntryPath> changedPath = log.getChangedPaths();
? ? ? ? ? ? ?? ?if(submitAuth.indexOf(log.getAuthor())<0) {//统计提交人
? ? ? ? ? ? ?? ??? ?for(String key : changedPath.keySet()) {
? ? ? ? ? ? ? ? ?? ??? ?if(submitAuth.indexOf(log.getAuthor())<0 && (key.indexOf(".java")>-1 || key.indexOf(".jsp")>-1)) {
? ? ? ? ? ? ? ? ?? ??? ??? ?submitAuth = submitAuth + "、" +log.getAuthor();
? ? ? ? ? ? ? ? ?? ??? ?}
? ? ? ? ? ? ? ? ?? ?}
? ? ? ? ? ? ?? ?}
? ? ? ? ? ? ? ? File logFile = getChangeLog(lastVersion, log.getRevision());
? ? ? ? ? ? ? ? int addSize = staticticsCodeAdd(logFile);
? ? ? ? ? ? ? ? sum+=addSize;
? ? ? ? ? ? ? ? lastVersion = log.getRevision();
? ? ? ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return sum;
? ? }
? ? //获取某一版本有变动的文件路径
? ? static List<SVNLogEntryPath> result = new ArrayList<>();
? ? public List<SVNLogEntryPath> getChangeFileList(long version) throws SVNException{
? ??
? ? ? ? SVNLogClient logClient = new SVNLogClient(authManager, options);
? ? ? ? SVNURL url = SVNURL.parseURIEncoded(urlString);
? ? ? ? String[] paths = { "." };
? ? ? ? SVNRevision pegRevision = SVNRevision.create( version );
? ? ? ? SVNRevision startRevision = SVNRevision.create( version );
? ? ? ? SVNRevision endRevision = SVNRevision.create( version );
? ? ? ? boolean stopOnCopy = false;
? ? ? ? boolean discoverChangedPaths = true;
? ? ? ? long limit = 9999l;
? ? ? ??
? ? ? ? ISVNLogEntryHandler handler = new ISVNLogEntryHandler() {
?
? ? ? ? ? ? /**
? ? ? ? ? ? ?* This method will process when doLog() is done
? ? ? ? ? ? ?*/
? ? ? ? ? ? @Override
? ? ? ? ? ? public void handleLogEntry( SVNLogEntry logEntry ) throws SVNException {
? ? ? ? ? ? ? ? System.out.println( "Author: " + logEntry.getAuthor() );
? ? ? ? ? ? ? ? System.out.println( "Date: " + logEntry.getDate() );
? ? ? ? ? ? ? ? System.out.println( "Message: " + logEntry.getMessage() );
? ? ? ? ? ? ? ? System.out.println( "Revision: " + logEntry.getRevision() );
? ? ? ? ? ? ? ? System.out.println("-------------------------");
? ? ? ? ? ? ? ? Map<String, SVNLogEntryPath> maps = logEntry.getChangedPaths();
? ? ? ? ? ? ? ? Set<Map.Entry<String, SVNLogEntryPath>> entries = maps.entrySet();
? ? ? ? ? ? ? ? for(Map.Entry<String, SVNLogEntryPath> entry : entries){
? ? ? ? ? ? ? ? ? ? //System.out.println(entry.getKey());
? ? ? ? ? ? ? ? ? ? SVNLogEntryPath entryPath = entry.getValue();
? ? ? ? ? ? ? ? ? ? result.add(entryPath);
? ? ? ? ? ? ? ? ? ? System.out.println(entryPath.getType()+" "+entryPath.getPath());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? };
? ? ? ? try {
? ? ? ? ? ? logClient.doLog( url, paths, pegRevision, startRevision, endRevision, stopOnCopy, discoverChangedPaths, limit, handler );
? ? ? ? }
? ? ? ? catch ( SVNException e ) {
? ? ? ? ? ? System.out.println( "Error in doLog() " );
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return result;
? ? }
? ??
? ? //获取指定文件内容
? ? public String checkoutFileToString(String url){//"", -1, null ??
? ? ? ? try { ?
? ? ? ? ? ? SVNDirEntry entry = repos.getDir("", -1, false, null); ?
? ? ? ? ? ? int size = (int)entry.getSize(); ?
? ? ? ? ? ? ByteArrayOutputStream outputStream = new ByteArrayOutputStream(size); ?
? ? ? ? ? ? SVNProperties properties = new SVNProperties(); ?
? ? ? ? ? ? repos.getFile("", -1, properties, outputStream); ?
? ? ? ? ? ? String doc = new String(outputStream.toByteArray(),Charset.forName("utf-8")); ?
? ? ? ? ? ? return doc; ?
? ? ? ? } catch (SVNException e) { ?
? ? ? ? ? ? e.printStackTrace(); ?
? ? ? ? } ?
? ? ? ? return null; ?
? ? }
? ??
? ? //列出指定SVN 地址目录下的子目录?
? ? public List<SVNDirEntry> listFolder(String url){ ?
? ? ? ? if(checkPath(url)==1){ ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? try { ?
? ? ? ? ? ? ? ? Collection<SVNDirEntry> list = repos.getDir("", -1, null, (List<SVNDirEntry>)null); ?
? ? ? ? ? ? ? ? List<SVNDirEntry> dirs = new ArrayList<SVNDirEntry>(list.size()); ?
? ? ? ? ? ? ? ? dirs.addAll(list); ?
? ? ? ? ? ? ? ? return dirs; ?
? ? ? ? ? ? } catch (SVNException e) { ?
? ? ? ? ? ? ? ? e.printStackTrace();?
? ? ? ? ? ? } ?
??
? ? ? ? } ?
? ? ? ? return null; ?
? ? }?
? ??
? ? //检查路径是否存在?
? ? public int checkPath(String url){ ? ?
? ? ? ? SVNNodeKind nodeKind; ?
? ? ? ? try { ?
? ? ? ? ? ? nodeKind = repos.checkPath("", -1); ?
? ? ? ? ? ? boolean result = nodeKind == SVNNodeKind.NONE ? false : true; ?
? ? ? ? ? ? if(result) return 1; ?
? ? ? ? } catch (SVNException e) { ?
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? return -1; ?
? ? ? ? } ?
? ? ? ? return 0; ?
? ? }
}

package util;

public class ChangeFile {

? ??
? ? private String filePath;
? ? private String fileType;
? ??
? ? /**A表示增加文件,M表示修改文件,D表示删除文件,U表示末知
? ? ?*?
? ? ?*/
? ? private Character changeType;
? ? private String fileContent;
? ??
? ??
? ??
? ??
? ? public ChangeFile() {
? ? }
? ? public ChangeFile(String filePath) {
? ? ? ? this.filePath = filePath;
? ? ? ? this.fileType = getFileTypeFromPath(filePath);
? ? }
? ? public ChangeFile(String filePath, Character changeType, String fileContent) {
? ? ? ? this.filePath = filePath;
? ? ? ? this.changeType = changeType;
? ? ? ? this.fileContent = fileContent;
? ? ? ? this.fileType = getFileTypeFromPath(filePath);
? ? }
? ? public String getFilePath() {
? ? ? ? return filePath;
? ? }
? ? public void setFilePath(String filePath) {
? ? ? ? this.filePath = filePath;
? ? }
? ? public String getFileType() {
? ? ? ? return fileType;
? ? }
? ? public void setFileType(String fileType) {
? ? ? ? this.fileType = fileType;
? ? }
? ? public Character getChangeType() {
? ? ? ? return changeType;
? ? }
? ? public void setChangeType(Character changeType) {
? ? ? ? this.changeType = changeType;
? ? }
? ? public String getFileContent() {
? ? ? ? return fileContent;
? ? }
? ? public void setFileContent(String fileContent) {
? ? ? ? this.fileContent = fileContent;
? ? }
? ??
? ? private static String getFileTypeFromPath(String path) {
? ? ? ? String FileType = "";
? ? ? ? int idx = path.lastIndexOf(".");
? ? ? ? if (idx > -1) {
? ? ? ? ? ? FileType = path.substring(idx + 1).trim().toLowerCase();
? ? ? ? }
? ? ? ? return FileType;
? ? }

}

当svn地址是https开头时如果报握手失败以及The server selected protocol version TLS10 is not accepted by client preferences [TLS12]这个错误时,需要把jdk\jre\lib\security里的java.security修改一下配置,在文件中找到jdk.tls.disabledAlgorithms把TLSv1, TLSv1.1删除然后重启即可。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:07:01  更:2022-07-20 19:09:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:22:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码